home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 093 < prev    next >
Text File  |  1995-04-15  |  90KB  |  2,449 lines

  1. C.S.M.P. Digest             Sat, 15 Apr 95       Volume 3 : Issue 93
  2.  
  3. Today's Topics:
  4.  
  5.         Counting PICT resources in a particular file?
  6.         Creating C++ objects inside handles
  7.         Getting a printer's bit depth
  8.         Good Mac software Installer
  9.         InitZone strangeness
  10.         Postponing AE reply ?
  11.         Simple Sound
  12.         TETextBox - How many lines ?
  13.         [Q] Going modal-less?
  14.  
  15.  
  16.  
  17. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  18. (pottier@clipper.ens.fr).
  19.  
  20. The digest is a collection of article threads from the internet newsgroup
  21. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  22. regularly and want an archive of the discussions.  If you don't know what a
  23. newsgroup is, you probably don't have access to it.  Ask your systems
  24. administrator(s) for details.  If you don't have access to news, you may
  25. still be able to post messages to the group by using a mail server like
  26. anon.penet.fi (mail help@anon.penet.fi for more information).
  27.  
  28. Each issue of the digest contains one or more sets of articles (called
  29. threads), with each set corresponding to a 'discussion' of a particular
  30. subject.  The articles are not edited; all articles included in this digest
  31. are in their original posted form (as received by our news server at
  32. nef.ens.fr).  Article threads are not added to the digest until the last
  33. article added to the thread is at least two weeks old (this is to ensure that
  34. the thread is dead before adding it to the digest).  Article threads that
  35. consist of only one message are generally not included in the digest.
  36.  
  37. The digest is officially distributed by two means, by email and ftp.
  38.  
  39. If you want to receive the digest by mail, send email to listserv@ens.fr
  40. with no subject and one of the following commands as body:
  41.     help                                Sends you a summary of commands
  42.     subscribe csmp-digest Your Name     Adds you to the mailing list
  43.     signoff csmp-digest                 Removes you from the list
  44. Once you have subscribed, you will automatically receive each new
  45. issue as it is created.
  46.  
  47. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  48. Questions related to the ftp site should be directed to
  49. scott.silver@dartmouth.edu.
  50.  
  51. -------------------------------------------------------
  52.  
  53. >From bhorling@trincoll.edu (Bryan Horling)
  54. Subject: Counting PICT resources in a particular file?
  55. Date: 30 Mar 1995 04:23:58 GMT
  56. Organization: Trinity College
  57.  
  58. Does anyone know how to count the number of PICT resources (or any
  59. resource type, for that matter) in a particular file?  This is to make a
  60. pop-up menu of all their names on the fly in a preferences dialog box.  I
  61. know about CountResources, but that seems like it'll look through the
  62. whole resource list, thus getting additional ones from other places such
  63. as the System.  Am I wrong about this?  Thanks in advance.
  64.  
  65. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  66.        --Bryan Horling--       |  >>bhorling@mail.trincoll.edu<<
  67.        -Head Consultant-       |          Trinity College
  68.   "Do not use GAK on varnished |          300 Summit St
  69.     on unvarnished surfaces"   |          Hartford, CT
  70. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  71.                 http://shakti.trincoll.edu/~bhorling
  72.  
  73. +++++++++++++++++++++++++++
  74.  
  75. >From Francois-Regis.Degott@imag.fr (F. Degott)
  76. Date: 30 Mar 1995 07:36:18 GMT
  77. Organization: LMC-IMAG Grenoble France
  78.  
  79. In article <bhorling-2903952336400001@bhorling.mac.trincoll.edu>,
  80. bhorling@trincoll.edu (Bryan Horling) wrote:
  81.  
  82. > Does anyone know how to count the number of PICT resources (or any
  83. > resource type, for that matter) in a particular file?  This is to make a
  84. > pop-up menu of all their names on the fly in a preferences dialog box.  I
  85. > know about CountResources, but that seems like it'll look through the
  86. > whole resource list, thus getting additional ones from other places such
  87. > as the System.  Am I wrong about this?  Thanks in advance.
  88.  
  89. Hi,
  90.  
  91. Try to use the function Count1Resources, describe below.
  92. It's up to you to set the current res. file with your particular file
  93. before the call, and restore the old res. file after that...
  94.  
  95. FUNCTION Count1Resources (theType: ResType) : INTEGER;
  96.  
  97.     Count1Resources is the same as CountResources except that it returns
  98. the total number of resources of the given type in the current resource
  99. file ONLY.
  100.  
  101. Bye.
  102. __________________________________________
  103. F.R. Degott  (Francois-Regis.Degott@imag.fr)
  104. Lab. LMC-IMAG - Univ. Joseph Fourier - Grenoble - France
  105.  
  106. +++++++++++++++++++++++++++
  107.  
  108. >From BrianS@pbcomputing.com (Brian Stern)
  109. Date: Thu, 30 Mar 1995 11:53:18 -0600
  110. Organization: OuterNet Connections, Inc.
  111.  
  112. In article <bhorling-2903952336400001@bhorling.mac.trincoll.edu>,
  113. bhorling@trincoll.edu (Bryan Horling) wrote:
  114.  
  115. < Does anyone know how to count the number of PICT resources (or any
  116. < resource type, for that matter) in a particular file?  This is to make a
  117. < pop-up menu of all their names on the fly in a preferences dialog box.  I
  118. < know about CountResources, but that seems like it'll look through the
  119. < whole resource list, thus getting additional ones from other places such
  120. < as the System.  Am I wrong about this?  Thanks in advance.
  121. <        --Bryan Horling--       |  >>bhorling@mail.trincoll.edu<<
  122.  
  123. Try Count1Resources.
  124.  
  125. ____________________________________________________________________
  126. Brian  Stern  :-{)}                           BrianS@pbcomputing.com
  127. Toolbox commando and Menu bard.             Will FlushCache for Cash
  128.  
  129. +++++++++++++++++++++++++++
  130.  
  131. >From Gordon Graber <gg4921s@acad.drake.edu>
  132. Date: 30 Mar 1995 18:58:36 GMT
  133. Organization: Drake University
  134.  
  135. In article <bhorling-2903952336400001@bhorling.mac.trincoll.edu> Bryan
  136. Horling, bhorling@trincoll.edu writes:
  137. >know about CountResources, but that seems like it'll look through the
  138. >whole resource list, thus getting additional ones from other places such
  139. >as the System.  Am I wrong about this?  Thanks in advance.
  140.  
  141. I don't have the exact commands off the top of my head but:
  142. You will need to set the current resource file, there is res manager call
  143. to do this.
  144. Then you will use CountIndResources to count only resources of a
  145. particular type in the current resource file.
  146.  
  147. You're right, if you don't set the current res file and then use the
  148. CountIndRes ( the current res file is the last opened res file ), you
  149. will get the number of all the resources (of the type you specify) in all
  150. opened res forks....
  151.  
  152. Gordon Graber: gg4921s@acad.drake.edu
  153.  
  154. +++++++++++++++++++++++++++
  155.  
  156. >From joelaff@aol.com (JoeLaff)
  157. Date: 31 Mar 1995 10:21:00 -0500
  158. Organization: America Online, Inc. (1-800-827-6364)
  159.  
  160. In article <bhorling-2903952336400001@bhorling.mac.trincoll.edu> Bryan
  161. Horling, bhorling@trincoll.edu writes:
  162. >know about CountResources, but that seems like it'll look through the
  163. >whole resource list, thus getting additional ones from other places such
  164. >as the System.  Am I wrong about this?  Thanks in advance.
  165.  
  166. You are correct CountResources always counts the resources in ALL open
  167. resource files, REGARDLESS of which resource file is active.
  168.  
  169. You need to UseResFile the file you wish to count in, and then call
  170. Count1Resources(). The calls that include "1" (e.g. Get1Resource) only act
  171. on the current resfile.
  172.  
  173. Good Luck.
  174. Joe <----
  175. ****  E N D    O F    L I N E  ****
  176.  
  177. ---------------------------
  178.  
  179. >From jdunning@flagstaff.princeton.edu (John A. Dunning)
  180. Subject: Creating C++ objects inside handles
  181. Date: Sat, 18 Mar 1995 21:34:37 GMT
  182. Organization: Princeton University
  183.  
  184.  
  185. I just realized I don't understand how to create a new instance
  186. of a class inside a handle.  The new operator returns a pointer
  187. to the newly allocated memory, but I'm assuming on a Mac that that's
  188. a non-relocatable block on the heap.  What if I want the the new
  189. object to reside in a relocatable block, i.e. a handle?  I'd like
  190. the constructors and destructors to be called appropriately
  191. when the handle is allocated or deallocated.
  192.  
  193. The only way I can think of doing this is creating the instance
  194. on the stack or with new, then doing a BlockMove to stick it in
  195. a handle.  This is pretty cumbersome, and the destructor gets 
  196. called for the stack object, not the copy in the handle.  Seems
  197. like there should be a better way.  Is there?  Or am I 
  198. approaching the problem the wrong way?  How do others handle
  199. (as it were) objects inside relocatable blocks?
  200.  
  201. If it makes any difference (although I don't think it would), 
  202. I'm using CodeWarrior.
  203.  
  204. Any help you can give would be appreciated.
  205.  
  206. Thanks,
  207.  
  208. John
  209. -- 
  210.  
  211. ______________________________________________________________________________
  212. John Dunning                                    jdunning@phoenix.princeton.edu
  213.  
  214. +++++++++++++++++++++++++++
  215.  
  216. >From dlakelan@iastate.edu (Dan Lakeland)
  217. Date: 19 Mar 95 20:08:41 GMT
  218. Organization: Iowa State University, Ames, Iowa
  219.  
  220. In <1995Mar18.213437.22156@Princeton.EDU> jdunning@flagstaff.princeton.edu (John A. Dunning) writes:
  221.  
  222.  
  223. >I just realized I don't understand how to create a new instance
  224. >of a class inside a handle.  The new operator returns a pointer
  225. >to the newly allocated memory, but I'm assuming on a Mac that that's
  226. >a non-relocatable block on the heap.  What if I want the the new
  227. >object to reside in a relocatable block, i.e. a handle?  I'd like
  228. >the constructors and destructors to be called appropriately
  229. >when the handle is allocated or deallocated.
  230.  
  231. >The only way I can think of doing this is creating the instance
  232. >on the stack or with new, then doing a BlockMove to stick it in
  233. >a handle.  This is pretty cumbersome, and the destructor gets 
  234. >called for the stack object, not the copy in the handle.  Seems
  235. >like there should be a better way.  Is there?  Or am I 
  236. >approaching the problem the wrong way?  How do others handle
  237. >(as it were) objects inside relocatable blocks?
  238.  
  239. Well, the short answer is "You DON'T" the explanation has to do with the
  240. "this" pointer and virtual tables and destructors and multiple
  241. inheritance. I don't fully understand it but the gist is that every C++
  242. object needs to maintain a pointer to itself and if it were in a handle,
  243. that pointer would become invalid quickly. 
  244.  
  245. now, you can have all your object's DATA in a handle. 
  246.  
  247. struct MyObjStruct
  248. {
  249.   // your data items here
  250. };
  251.  
  252.  
  253. //class declaration
  254. private:
  255.  
  256.   MyObjStruct **theData;
  257. };
  258.  
  259. then in the constructor do
  260.  
  261. theData = (MyObjStruct**) NewHandle(sizeof(MyObjStruct));
  262.  
  263. voila you get relocatable storage for your data, and only the overhead
  264. of the object is static.
  265. -- 
  266. Daniel Lakeland: Macintosh Hacker, Mathematics Major, NRA Member.
  267. Macintosh Hacking, an art best learned w/ an axe...
  268. The computer programmer's worst nightmare:
  269. Unwittingly finding compiler bugs.
  270.  
  271. +++++++++++++++++++++++++++
  272.  
  273. >From j-jahnke@uchicago.edu (Jerome Jahnke)
  274. Date: Mon, 20 Mar 1995 04:29:44 GMT
  275. Organization: BSD -- Academic Computing
  276.  
  277. In article <1995Mar18.213437.22156@Princeton.EDU>,
  278. jdunning@flagstaff.princeton.edu (John A. Dunning) wrote:
  279.  
  280. > I just realized I don't understand how to create a new instance
  281. > of a class inside a handle.  The new operator returns a pointer
  282. > to the newly allocated memory, but I'm assuming on a Mac that that's
  283. > a non-relocatable block on the heap.  What if I want the the new
  284. > object to reside in a relocatable block, i.e. a handle?  I'd like
  285. > the constructors and destructors to be called appropriately
  286. > when the handle is allocated or deallocated.
  287.  
  288. Ahhhhhhhhhhh you can't do that, the reason is kinda simple but it has to
  289. do with  the this table, and how the compiler keeps track of things. The
  290. only real way to store a lot of data in a structure that is an object is
  291. to stuff all the data into a handle and lock and unlock it as you need.
  292.  
  293. If you REALLY need handle based objects you need to look at something like
  294. ObjectPascal, or use an earlier version of Think C++. I don't think any of
  295. the compilers today use handle based objects, which stole a bit from the
  296. C++ language set, no virtual destructors, and no multiple inheritence.
  297.  
  298. Contrary to popular belief pointers are not devil spawn. They have uses.
  299.  
  300. Jer,
  301.  
  302. -- 
  303. Jerome Jahnke
  304. BSD Academic Computing
  305. University of Chicago
  306. j-jahnke@uchicago.edu
  307.  
  308. +++++++++++++++++++++++++++
  309.  
  310. >From altura@aol.com (ALTURA)
  311. Date: 20 Mar 1995 00:14:58 -0500
  312. Organization: America Online, Inc. (1-800-827-6364)
  313.  
  314. > I don't think any of
  315. > the compilers today use handle based objects, which stole a bit from the
  316. > C++ language set, no virtual destructors, and no multiple inheritence.
  317. SymC++ has a "handle-based" class extension to their C++ compiler ala
  318. HandleObject in MPW.
  319.  
  320. ==========================
  321. Jordan Zimmerman
  322. jordanz@altura.com
  323. http://www.altura.com/jordanz/home.html
  324. Who is John Galt?
  325.  
  326. +++++++++++++++++++++++++++
  327.  
  328. >From j-jahnke@uchicago.edu (Jerome Jahnke)
  329. Date: Mon, 20 Mar 1995 16:26:25 GMT
  330. Organization: BSD -- Academic Computing
  331.  
  332. In article <3kj30i$98b@newsbf02.news.aol.com>, altura@aol.com (ALTURA) wrote:
  333.  
  334. > > I don't think any of
  335. > > the compilers today use handle based objects, which stole a bit from the
  336. > > C++ language set, no virtual destructors, and no multiple inheritence.
  337. > SymC++ has a "handle-based" class extension to their C++ compiler ala
  338. > HandleObject in MPW.
  339.  
  340. I stand corrected. I have not used them in a while due to the extreme
  341. limitations they place on my C++ work.
  342.  
  343. Jer,
  344.  
  345. -- 
  346. Jerome Jahnke
  347. BSD Academic Computing
  348. University of Chicago
  349. j-jahnke@uchicago.edu
  350.  
  351. +++++++++++++++++++++++++++
  352.  
  353. >From bgulian@crl.com (bob gulian)
  354. Date: 20 Mar 1995 18:26:46 GMT
  355. Organization: CRL Dialup Internet Access
  356.  
  357. In article <j-jahnke-2003951032500001@bio-38.bsd.uchicago.edu>,
  358. j-jahnke@uchicago.edu (Jerome Jahnke) wrote:
  359.  
  360. > In article <3kj30i$98b@newsbf02.news.aol.com>, altura@aol.com (ALTURA) wrote:
  361. > > > I don't think any of
  362. > > > the compilers today use handle based objects, which stole a bit from the
  363. > > > C++ language set, no virtual destructors, and no multiple inheritence.
  364. > > SymC++ has a "handle-based" class extension to their C++ compiler ala
  365. > > HandleObject in MPW.
  366. > I stand corrected. I have not used them in a while due to the extreme
  367. > limitations they place on my C++ work.
  368. > Jer,
  369. > -- 
  370. > Jerome Jahnke
  371. > BSD Academic Computing
  372. > University of Chicago
  373. > j-jahnke@uchicago.edu
  374.  
  375.  
  376. Ok, here's how Lippman would do it.  I paraphrase and transmogrify.
  377.  
  378. class BaseClass {
  379. public:
  380.    void *operator new(size_t);
  381.    void *operator delete();
  382.    void Lock();
  383.    void Unlock();
  384. private:
  385.    Handle mOurStore;
  386. };
  387.  
  388.  
  389. void *BaseClass::operator new(size_t size)
  390. {
  391.    mOurStore = NewHandle(size);
  392.    return (BaseClass *)mOurStore;   
  393. }
  394.  
  395. void *BaseClass::operator delete()
  396. {
  397.    if (mOurStore)
  398.       DisposHandle( mOurStore );
  399.    mOurStore = NULL;
  400.  
  401. }
  402.  
  403. void BaseClass::Lock()
  404. {
  405.    HLock( mOurStore );
  406. }
  407.  
  408. void BaseClass::Unlock()
  409. {
  410.    HUnlock( mOurStore );
  411. }
  412.  
  413.  
  414. Then you subclass all classes you want Handle Based from BaseClass.
  415.  
  416. Okay, now, having given you a way to do this, I have to say that it is
  417. most foolhardy.  Handles are TROUBLE!  You absolutely must lock your class
  418. everytime you pass a member of it in a function.  You better remember to
  419. unlock it too.  In an asynchronous message passing OOP environment this is
  420. bound to be dangerous and slow.
  421.  
  422. Overloading new and delete is not a bad idea.  Symantec's new and delete
  423. leave something to be desired but call malloc() not NewHandle().  Anyway,
  424. that's my two cents.
  425.  
  426. Bob,
  427.  
  428. +++++++++++++++++++++++++++
  429.  
  430. >From THUNDERONE@news.delphi.com (THUNDERONE@DELPHI.COM)
  431. Date: 20 Mar 1995 22:17:17 -0500
  432. Organization: Delphi Internet Services Corporation
  433.  
  434. altura@aol.com (ALTURA) writes:
  435.  
  436. >> I don't think any of
  437. >> the compilers today use handle based objects, which stole a bit from the
  438. >> C++ language set, no virtual destructors, and no multiple inheritence.
  439. >SymC++ has a "handle-based" class extension to their C++ compiler ala
  440. >HandleObject in MPW.
  441.  
  442. As does Metrowerks.  Derive a class from HandleObject:
  443.  
  444. class HeyICanProgram : HandleObject
  445. {
  446.     // ....
  447. };
  448.  
  449. ________________.______.._____...___....._.....................
  450. Chris Thomas, thunderone@delphi.com, friend of the devil
  451. "And how did someone screw this up?  Let's call up Symantec and scream 
  452. at them for a while."
  453.  
  454. +++++++++++++++++++++++++++
  455.  
  456. >From jens_alfke@powertalk.apple.com (Jens Alfke)
  457. Date: Mon, 20 Mar 1995 21:19:05 GMT
  458. Organization: Apple Computer, Inc.
  459.  
  460. In article <dlakelan.795643721@las1.iastate.edu>, dlakelan@iastate.edu
  461. (Dan Lakeland) wrote:
  462.  
  463. > Well, the short answer is "You DON'T" the explanation has to do with the
  464. > "this" pointer and virtual tables and destructors and multiple
  465. > inheritance. I don't fully understand it but the gist is that every C++
  466. > object needs to maintain a pointer to itself and if it were in a handle,
  467. > that pointer would become invalid quickly. 
  468.  
  469. No, this is not true. There's nothing stopping you from storing an object
  470. in a handle. Most Mac C++ compilers even make it easy for you by
  471. predefining a base class called HandleObject; any class derived from
  472. HandleObject allocates its instances in handles. The nice part is that you
  473. can continue to use the normal '->' form to refer to methods and instance
  474. variables; the compiler takes care of adding the additional dereference.
  475. What is _not_ possible is to mix handle objects and multiple inheritance;
  476. this is because MI relies on the fact that an object can contain another
  477. object, but of course you cannot store one relocatable block inside
  478. another. For the same reason, it's obviously impossible to use a
  479. HandleObject itself (not just a pointer to one) as a member of another
  480. object.
  481.  
  482. CFront, Symantec C++ and CodeWarrior all support HandleObject. And in
  483. THINK C (which isn't really C++) all objects are allocated in handles.
  484.  
  485.  
  486. Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  487.                                            OpenDoc info: FTP to CILabs.org
  488.  
  489.          Visit Scenic Flood Control Dam No. 3.      
  490.  
  491. +++++++++++++++++++++++++++
  492.  
  493. >From rodden@cse.ucsc.edu (James Rodden)
  494. Date: Wed, 22 Mar 1995 01:34:32 -0800
  495. Organization: DD/MF & Associates
  496.  
  497. In article <jens_alfke-2003951317580001@jensothermac.apple.com>,
  498. jens_alfke@powertalk.apple.com (Jens Alfke) wrote:
  499.  
  500. >In article <dlakelan.795643721@las1.iastate.edu>, dlakelan@iastate.edu
  501. >(Dan Lakeland) wrote:
  502. >
  503. >> Well, the short answer is "You DON'T" the explanation has to do with the
  504. >> "this" pointer and virtual tables and destructors and multiple
  505. >> inheritance. I don't fully understand it but the gist is that every C++
  506. >> object needs to maintain a pointer to itself and if it were in a handle,
  507. >> that pointer would become invalid quickly. 
  508. >
  509. >No, this is not true. There's nothing stopping you from storing an object
  510. >in a handle. Most Mac C++ compilers even make it easy for you by
  511. >predefining a base class called HandleObject; any class derived from
  512. >HandleObject allocates its instances in handles. The nice part is that you
  513. >can continue to use the normal '->' form to refer to methods and instance
  514. >variables; the compiler takes care of adding the additional dereference.
  515. >What is _not_ possible is to mix handle objects and multiple inheritance;
  516. >this is because MI relies on the fact that an object can contain another
  517. >object, but of course you cannot store one relocatable block inside
  518. >another. For the same reason, it's obviously impossible to use a
  519. >HandleObject itself (not just a pointer to one) as a member of another
  520. >object.
  521. >
  522. >CFront, Symantec C++ and CodeWarrior all support HandleObject. And in
  523. >THINK C (which isn't really C++) all objects are allocated in handles.
  524. >
  525.  
  526. Really?! Where is this class found in the CodeWarrior directories?
  527.  
  528. Jim
  529.  
  530. -- 
  531. J.Rodden, DD/MF & Associates
  532. Simlab Development Team, Product Architect
  533.  
  534. +++++++++++++++++++++++++++
  535.  
  536. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  537. Date: Thu, 23 Mar 1995 16:43:30 +1200 (NZDT)
  538. Organization: (none)
  539.  
  540. jdunning@flagstaff.princeton.edu (John A. Dunning) writes:
  541. > I just realized I don't understand how to create a new instance
  542. > of a class inside a handle.  The new operator returns a pointer
  543. > to the newly allocated memory, but I'm assuming on a Mac that that's
  544. > a non-relocatable block on the heap.  What if I want the the new
  545. > object to reside in a relocatable block, i.e. a handle?
  546.  
  547. Do *not* do this!
  548.  
  549. C++ objects can *not* live in moveable memory.  Apple privided special
  550. support in the CFront compiler for doing this, but now that CFront is
  551. not supported any more you have no way of doing this.
  552.  
  553. It's possible to get away with it (apart from the constructor/destructor
  554. problems) with single-inheritence hierachies, but if you use multiple
  555. inheritence anywhere then handles are *death*.  This is because C++
  556. will be creating and passing around pointers into the middle of the
  557. object, and you have no way of knowing if the object moves.
  558.  
  559. Now the question is: *why* do you want to put a C++ object into a handle?
  560. I can't see a good reason to do it.
  561.  
  562. It make a lot of sense to have a small C++ object that *contains* a
  563. Handle to some storage, and manages it for you in some way, automatically
  564. freeing the handle when the C++ object's destructor is executed.  And
  565. it's often useful to have several such small C++ objects share one
  566. Handle, maintaining a "reference count" to say how many are using it and
  567. freeing the Handle when the last reference goes.
  568.  
  569. But this is quite different to what you are asking about.
  570.  
  571. -- Bruce
  572.  
  573. +++++++++++++++++++++++++++
  574.  
  575. >From jdunning@flagstaff.princeton.edu (John A. Dunning)
  576. Date: Mon, 20 Mar 1995 08:26:00 GMT
  577. Organization: Princeton University
  578.  
  579. In article <dlakelan.795643721@las1.iastate.edu>,
  580. Dan Lakeland <dlakelan@iastate.edu> wrote:
  581. >In <1995Mar18.213437.22156@Princeton.EDU> jdunning@flagstaff.princeton.edu (John A. Dunning) writes:
  582. >
  583. >>I just realized I don't understand how to create a new instance
  584. >>of a class inside a handle.  The new operator returns a pointer
  585. >>to the newly allocated memory, but I'm assuming on a Mac that that's
  586. >>a non-relocatable block on the heap.  What if I want the the new
  587. >>object to reside in a relocatable block, i.e. a handle?  I'd like
  588. >>the constructors and destructors to be called appropriately
  589. >>when the handle is allocated or deallocated.
  590. >
  591. >Well, the short answer is "You DON'T" the explanation has to do with the
  592. >"this" pointer and virtual tables and destructors and multiple
  593. >inheritance. I don't fully understand it but the gist is that every C++
  594. >object needs to maintain a pointer to itself and if it were in a handle,
  595. >that pointer would become invalid quickly. 
  596.  
  597. Then how do classes like LDynamicArray work?  It stores the 
  598. items of the array in a handle, the size of which it adjusts
  599. as items are added and deleted.  To insert an item, you pass
  600. a pointer to it, and the data is copied into the handle through
  601. a BlockMove.
  602.  
  603. Does this mean you shouldn't insert class objects into an
  604. LDynamicArray?  I've used an LNTable before (which uses an LDA
  605. to store its data) with objects I created with new.  I inserted
  606. the item into the table, then deleted it.  That seemed to work
  607. okay.  Maybe I just got lucky.
  608.  
  609. And where do objects allocated with new reside?  Do they just 
  610. get stuck in the middle of the heap?  Or does the Memory Manager
  611. try to do something intelligent with them?  What if you need
  612. to build a tree of nodes?  It seems like your heap will get
  613. fragmented pretty fast if you add and delete a lot of the nodes.
  614.  
  615. John
  616. -- 
  617.  
  618. ______________________________________________________________________________
  619. John Dunning                                    jdunning@phoenix.princeton.edu
  620.  
  621. +++++++++++++++++++++++++++
  622.  
  623. >From BrianS@pbcomputing.com (Brian Stern)
  624. Date: Thu, 23 Mar 1995 09:26:50 -0600
  625. Organization: OuterNet Connections, Inc.
  626.  
  627. In article <1995Mar20.082600.24708@Princeton.EDU>,
  628. jdunning@flagstaff.princeton.edu (John A. Dunning) wrote:
  629.  
  630. < In article <dlakelan.795643721@las1.iastate.edu>,
  631. < Dan Lakeland <dlakelan@iastate.edu> wrote:
  632. < >In <1995Mar18.213437.22156@Princeton.EDU>
  633. jdunning@flagstaff.princeton.edu (John A. Dunning) writes:
  634. < >
  635. < >>I just realized I don't understand how to create a new instance
  636. < >>of a class inside a handle.  The new operator returns a pointer
  637. < >>to the newly allocated memory, but I'm assuming on a Mac that that's
  638. < >>a non-relocatable block on the heap.  What if I want the the new
  639. < >>object to reside in a relocatable block, i.e. a handle?  I'd like
  640. < >>the constructors and destructors to be called appropriately
  641. < >>when the handle is allocated or deallocated.
  642. < >
  643. < >Well, the short answer is "You DON'T" the explanation has to do with the
  644. < >"this" pointer and virtual tables and destructors and multiple
  645. < >inheritance. I don't fully understand it but the gist is that every C++
  646. < >object needs to maintain a pointer to itself and if it were in a handle,
  647. < >that pointer would become invalid quickly. 
  648. < Then how do classes like LDynamicArray work?  It stores the 
  649. < items of the array in a handle, the size of which it adjusts
  650. < as items are added and deleted.  To insert an item, you pass
  651. < a pointer to it, and the data is copied into the handle through
  652. < a BlockMove.
  653.  
  654. LDynamicArray has a handle as a data member.  That's no problem.  The
  655. object itself doesn't move, only its data.
  656.  
  657. < Does this mean you shouldn't insert class objects into an
  658. < LDynamicArray?  I've used an LNTable before (which uses an LDA
  659. < to store its data) with objects I created with new.  I inserted
  660. < the item into the table, then deleted it.  That seemed to work
  661. < okay.  Maybe I just got lucky.
  662.  
  663. You can insert object pointers into an LDynamicArray, not the objects
  664. themselves.  It's perfectly OK, and a common idiom to make lists of object
  665. pointers. That's not the same as making lists of objects.
  666.  
  667. < And where do objects allocated with new reside?  Do they just 
  668. < get stuck in the middle of the heap?  Or does the Memory Manager
  669. < try to do something intelligent with them?  What if you need
  670. < to build a tree of nodes?  It seems like your heap will get
  671. < fragmented pretty fast if you add and delete a lot of the nodes.
  672.  
  673. Yes, heap fragmentation is a potential problem of using pointer-based
  674. objects.  Operator new runs on top of the memory manager, allocating large
  675. blocks (say 32K) from the heap that it then parcels out when you call new
  676. and reclaims when you call delete.  If you have special needs then you can
  677. override operator new for one or more classes and do it a smarter way.
  678.  
  679. I used the handle-based objects in TCL 1.1.3.  They worked fine but were
  680. limited.  (We didn't have real C++ at that time anyway so it wasn't a
  681. problem.)  These objects would sometimes move at inopportune times if you
  682. weren't careful, so having pointer-based objects makes life easier.  I
  683. would recommend not worrying about this.  If you profile your app and
  684. inspect its memory and find out that the heap is grossly fragmented then
  685. think about overriding operator new.
  686.  
  687. < John
  688. < -- 
  689. < ______________________________________________________________________________
  690. < John Dunning                                    jdunning@phoenix.princeton.edu
  691.  
  692. ____________________________________________________________________
  693. Brian  Stern  :-{)}                           BrianS@pbcomputing.com
  694. Toolbox commando and Menu bard.             Will FlushCache for Cash
  695.  
  696. +++++++++++++++++++++++++++
  697.  
  698. >From jens_alfke@powertalk.apple.com (Jens Alfke)
  699. Date: Thu, 23 Mar 1995 18:01:43 GMT
  700. Organization: Apple Computer, Inc.
  701.  
  702. In article <1995Mar20.082600.24708@Princeton.EDU>,
  703. jdunning@flagstaff.princeton.edu (John A. Dunning) wrote:
  704.  
  705. > Then how do classes like LDynamicArray work?  It stores the 
  706. > items of the array in a handle, the size of which it adjusts
  707. > as items are added and deleted.  To insert an item, you pass
  708. > a pointer to it, and the data is copied into the handle through
  709. > a BlockMove.
  710. > Does this mean you shouldn't insert class objects into an
  711. > LDynamicArray?
  712.  
  713. Go ahead, it's fine. The only problem would be if a method of one of these
  714. objects called a routine that could move memory, and the handle moved.
  715. This would invalidate the 'this' parameter to the method. This is the same
  716. problem that's been with us since 1984. Just lock the handle first or copy
  717. the object to someplace that can't move.
  718.  
  719.  
  720. Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  721.                                            OpenDoc info: FTP to CILabs.org
  722.  
  723.          Visit Scenic Flood Control Dam No. 3.      
  724.  
  725. +++++++++++++++++++++++++++
  726.  
  727. >From TomCondon@aol.com (Thomas P. Condon)
  728. Date: 23 Mar 1995 17:58:45 GMT
  729. Organization: Condon Consulting Services, Inc.
  730.  
  731. I don't think Jens Alfke understood what was being asked.
  732.  
  733. The simple answer of why not to do this is that a call to a member
  734. function always passes an implicit "this" on the stack.  You can get into
  735. the situation that 
  736.  
  737. 1.) You call myHandleObject->fInnerObject->DoSomething();
  738.  
  739. 2.) The compiler pushes the address to fInnerObject just before it calls
  740. TInnerObject::DoSomething(). (Hey! This address points to the middle of a
  741. relocatable block!!  DANGER!!!!)
  742.  
  743. 3.) Call TInnerObject::DoSomething(). OOPs!  The routine
  744. TInnerObject::DoSomething() is not in memory!  The segment loader goes to
  745. work!  Loads the segment! Moves memory! Moves myHandle! Address pushed on
  746. the stack is garbage now!!!
  747.  
  748. 4.) KABOOM!
  749.  
  750.  
  751.  
  752.  
  753.  
  754. In article <jens_alfke-2003951317580001@jensothermac.apple.com>,
  755. jens_alfke@powertalk.apple.com (Jens Alfke) wrote:
  756.  
  757. > In article <dlakelan.795643721@las1.iastate.edu>, dlakelan@iastate.edu
  758. > (Dan Lakeland) wrote:
  759. > > Well, the short answer is "You DON'T" the explanation has to do with the
  760. > > "this" pointer and virtual tables and destructors and multiple
  761. > > inheritance. I don't fully understand it but the gist is that every C++
  762. > > object needs to maintain a pointer to itself and if it were in a handle,
  763. > > that pointer would become invalid quickly. 
  764. > No, this is not true. There's nothing stopping you from storing an object
  765. > in a handle. Most Mac C++ compilers even make it easy for you by
  766. > predefining a base class called HandleObject; any class derived from
  767. > HandleObject allocates its instances in handles. The nice part is that you
  768. > can continue to use the normal '->' form to refer to methods and instance
  769. > variables; the compiler takes care of adding the additional dereference.
  770. > What is _not_ possible is to mix handle objects and multiple inheritance;
  771. > this is because MI relies on the fact that an object can contain another
  772. > object, but of course you cannot store one relocatable block inside
  773. > another. For the same reason, it's obviously impossible to use a
  774. > HandleObject itself (not just a pointer to one) as a member of another
  775. > object.
  776. > CFront, Symantec C++ and CodeWarrior all support HandleObject. And in
  777. > THINK C (which isn't really C++) all objects are allocated in handles.
  778. > Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  779. >                                            OpenDoc info: FTP to CILabs.org
  780. >          Visit Scenic Flood Control Dam No. 3.
  781.  
  782. +++++++++++++++++++++++++++
  783.  
  784. >From ivanski@world.std.com (Ivan M CaveroBelaunde)
  785. Date: Thu, 23 Mar 1995 20:25:36 GMT
  786. Organization: The World Public Access UNIX, Brookline, MA
  787.  
  788. TomCondon@aol.com (Thomas P. Condon) writes:
  789.  
  790. >I don't think Jens Alfke understood what was being asked.
  791.  
  792. >The simple answer of why not to do this is that a call to a member
  793. >function always passes an implicit "this" on the stack.  You can get into
  794. >the situation that 
  795.  
  796. >1.) You call myHandleObject->fInnerObject->DoSomething();
  797.  
  798. >2.) The compiler pushes the address to fInnerObject just before it calls
  799. >TInnerObject::DoSomething(). (Hey! This address points to the middle of a
  800. >relocatable block!!  DANGER!!!!)
  801.  
  802. >3.) Call TInnerObject::DoSomething(). OOPs!  The routine
  803. >TInnerObject::DoSomething() is not in memory!  The segment loader goes to
  804. >work!  Loads the segment! Moves memory! Moves myHandle! Address pushed on
  805. >the stack is garbage now!!!
  806.  
  807. >4.) KABOOM!
  808.  
  809. I don't think you understood what Jens said, actually, or how MI and
  810. embedded objects work in current C++ implementations. First, statement 1
  811. implies that fInnerObjects is not declared as a CSomeObject, but as a
  812. CSomeObject* (you call its DoSomething method via the -> operator instead
  813. of the . operator). Thus, when "this" is passed to DoSomething, it will
  814. *not* pass a pointer to the middle of a handle (since the actual contents
  815. of fInnerObject are not inside myHandleObject) and nothing bad will happen.
  816. Jens obliquely refers to this
  817.  
  818. >> For the same reason, it's obviously impossible to use a
  819. >> HandleObject itself (not just a pointer to one) as a member of another
  820. >> object.
  821.  
  822. It's actually not quite that: it's impossible to use any kind of object
  823. as a member of a HandleObject (note that this restriction does not
  824. apply to pointer to objects, however). Thus both
  825.  
  826. class TMixedObject : TMixin1, TMixin2 {
  827.         /* This is a subclass of HandleObject */
  828. ...
  829.   virtual void DoSomething1(); // inherited from TMixin1
  830.   virtual void DoSomething2(); // inherited from TMixin2
  831. }
  832.  
  833. and
  834.  
  835. class THandleObject {
  836.         /* This is a subclass of HandleObject */
  837. ...
  838.   TSomeOtherObject fObject; // contains DoSomething() method
  839. };
  840.  
  841. are evil. In the first case, either DoSomething1 or DoSomething2
  842. (depending on the implementation) will get a "this" that points to
  843. the middle of the handle (the case you describe). In the second case,
  844. DoSomething() will get a "this" that points to the middle of the
  845. handle as well. If the second case, however, had been declared as:
  846.  
  847.   TSomeOtherObject *fObject;
  848.  
  849. that would've worked.
  850.  
  851. -Ivan
  852. - --
  853. Ivan Cavero Belaunde (ivanski@world.std.com, ivan_cavero-belaunde@avid.com)
  854. Avid VideoShop Lead
  855. Avid Technology, Inc.
  856.  
  857. +++++++++++++++++++++++++++
  858.  
  859. >From j-jahnke@uchicago.edu (Jerome Jahnke)
  860. Date: Fri, 24 Mar 1995 00:49:15 GMT
  861. Organization: BSD -- Academic Computing
  862.  
  863. In article <1995Mar20.082600.24708@Princeton.EDU>,
  864. jdunning@flagstaff.princeton.edu (John A. Dunning) wrote:
  865.  
  866. > In article <dlakelan.795643721@las1.iastate.edu>,
  867. > Dan Lakeland <dlakelan@iastate.edu> wrote:
  868. > >In <1995Mar18.213437.22156@Princeton.EDU>
  869. jdunning@flagstaff.princeton.edu (John A. Dunning) writes:
  870. > >
  871. > >>I just realized I don't understand how to create a new instance
  872. > >>of a class inside a handle.  The new operator returns a pointer
  873. > >>to the newly allocated memory, but I'm assuming on a Mac that that's
  874. > >>a non-relocatable block on the heap.  What if I want the the new
  875. > >>object to reside in a relocatable block, i.e. a handle?  I'd like
  876. > >>the constructors and destructors to be called appropriately
  877. > >>when the handle is allocated or deallocated.
  878. > >
  879. > >Well, the short answer is "You DON'T" the explanation has to do with the
  880. > >"this" pointer and virtual tables and destructors and multiple
  881. > >inheritance. I don't fully understand it but the gist is that every C++
  882. > >object needs to maintain a pointer to itself and if it were in a handle,
  883. > >that pointer would become invalid quickly. 
  884. > Then how do classes like LDynamicArray work?  It stores the 
  885. > items of the array in a handle, the size of which it adjusts
  886. > as items are added and deleted.  To insert an item, you pass
  887. > a pointer to it, and the data is copied into the handle through
  888. > a BlockMove.
  889.  
  890. Because the class LDynamic Array is NOT a handle, it is a pointer. There
  891. is member field of that class that IS a handle. A very big difference.
  892.  
  893. Jer,
  894.  
  895. -- 
  896. Jerome Jahnke
  897. BSD Academic Computing
  898. University of Chicago
  899. j-jahnke@uchicago.edu
  900.  
  901. +++++++++++++++++++++++++++
  902.  
  903. >From marka4@metrowerks.com (Mark Anderson)
  904. Date: Fri, 24 Mar 1995 09:28:49 GMT
  905. Organization: metrowerks
  906.  
  907. In article <rodden-2203950134320001@cookiemonster.cse.ucsc.edu>,
  908. rodden@cse.ucsc.edu (James Rodden) wrote:
  909.  
  910. > In article <jens_alfke-2003951317580001@jensothermac.apple.com>,
  911. > jens_alfke@powertalk.apple.com (Jens Alfke) wrote:
  912. > >In article <dlakelan.795643721@las1.iastate.edu>, dlakelan@iastate.edu
  913. > >(Dan Lakeland) wrote:
  914. > >
  915. > >> Well, the short answer is "You DON'T" the explanation has to do with the
  916. > >> "this" pointer and virtual tables and destructors and multiple
  917. > >> inheritance. I don't fully understand it but the gist is that every C++
  918. > >> object needs to maintain a pointer to itself and if it were in a handle,
  919. > >> that pointer would become invalid quickly. 
  920. > >
  921. > >No, this is not true. There's nothing stopping you from storing an object
  922. > >in a handle. Most Mac C++ compilers even make it easy for you by
  923. > >predefining a base class called HandleObject; any class derived from
  924. > >HandleObject allocates its instances in handles. The nice part is that you
  925. > >can continue to use the normal '->' form to refer to methods and instance
  926. > >variables; the compiler takes care of adding the additional dereference.
  927. > >What is _not_ possible is to mix handle objects and multiple inheritance;
  928. > >this is because MI relies on the fact that an object can contain another
  929. > >object, but of course you cannot store one relocatable block inside
  930. > >another. For the same reason, it's obviously impossible to use a
  931. > >HandleObject itself (not just a pointer to one) as a member of another
  932. > >object.
  933. > >
  934. > >CFront, Symantec C++ and CodeWarrior all support HandleObject. And in
  935. > >THINK C (which isn't really C++) all objects are allocated in handles.
  936. > >
  937. > Really?! Where is this class found in the CodeWarrior directories?
  938. > Jim
  939. > -- 
  940. > J.Rodden, DD/MF & Associates
  941. > Simlab Development Team, Product Architect
  942.  
  943. There is no class.  Simply derive your classes from it.  It is more like
  944. an instruction to the compiler to use a smaller and faster inherited
  945. vtable format otherwise the MI format will be used. 
  946.  
  947. Mark Anderson
  948. marka4@metrowerks.com
  949.  
  950. +++++++++++++++++++++++++++
  951.  
  952. >From jdunning@flagstaff.princeton.edu (John A. Dunning)
  953. Date: Thu, 23 Mar 1995 22:00:45 GMT
  954. Organization: Princeton University
  955.  
  956. In article <D5wu2o.9K@world.std.com>,
  957. >It's actually not quite that: it's impossible to use any kind of object
  958. >as a member of a HandleObject (note that this restriction does not
  959. >apply to pointer to objects, however). Thus both
  960. >
  961. >class TMixedObject : TMixin1, TMixin2 {
  962. >       /* This is a subclass of HandleObject */
  963. >...
  964. >  virtual void DoSomething1(); // inherited from TMixin1
  965. >  virtual void DoSomething2(); // inherited from TMixin2
  966. >}
  967. >
  968. >and
  969. >
  970. >class THandleObject {
  971. >       /* This is a subclass of HandleObject */
  972. >...
  973. >  TSomeOtherObject fObject; // contains DoSomething() method
  974. >};
  975. >
  976. >are evil. In the first case, either DoSomething1 or DoSomething2
  977. >(depending on the implementation) will get a "this" that points to
  978. >the middle of the handle (the case you describe). In the second case,
  979. >DoSomething() will get a "this" that points to the middle of the
  980. >handle as well. If the second case, however, had been declared as:
  981. >
  982. >  TSomeOtherObject *fObject;
  983. >
  984. >that would've worked.
  985.  
  986. What if you always lock the HandleObject before calling its
  987. methods?  Or, if the HandleObject can lock itself, have it lock
  988. itself at the beginning of each of its methods.  Will that
  989. enable you to use multiple inheritance and have other objects
  990. as members of the HandleObject?
  991.  
  992. John
  993. -- 
  994.  
  995. ______________________________________________________________________________
  996. John Dunning                                    jdunning@phoenix.princeton.edu
  997.  
  998. +++++++++++++++++++++++++++
  999.  
  1000. >From fixer@faxcsl.dcrt.nih.gov (Chris Tate)
  1001. Date: Fri, 24 Mar 1995 17:03:17 GMT
  1002. Organization: DCRT, NIH, Bethesda, MD
  1003.  
  1004. In article <1995Mar23.220045.23899@Princeton.EDU>, jdunning@flagstaff.princeton.edu (John A. Dunning) writes:
  1005. >
  1006. > [ speaking of handle-based objects in C++ ]
  1007. >
  1008. > What if you always lock the HandleObject before calling its
  1009. > methods?  Or, if the HandleObject can lock itself, have it lock
  1010. > itself at the beginning of each of its methods.  Will that
  1011. > enable you to use multiple inheritance and have other objects
  1012. > as members of the HandleObject?
  1013.  
  1014. Or:
  1015.  
  1016. What if, rather than storing 'this' pointers and passing them as arguments
  1017. to methods (which as I understand it is the reason why MI fails for handle-
  1018. based objects in existing implementations - whereas you can supply a 'this'
  1019. pointer into the 'middle' of a composite object, you can't have a 'this'
  1020. handle pointing into the middle of another handle), you instead used a 'this'
  1021. handle *and an offset into the block*?  This is equivalent to having a
  1022. pointer into the middle of the block, and it's invariant over movement of
  1023. the block in memory.
  1024.  
  1025. Obviously, comparison of 'this' pointers and related issues would need to
  1026. be handled specially by the compiler, and stack-based objects might be a
  1027. bit of a mess (or might not - I'd have to poke into the details to be sure),
  1028. but I don't see why the implementation of 'this' can't change to accomodate
  1029. the change in the implementation of a 'pointer' that is implicit in using
  1030. handle storage rather than direct pointer storage...
  1031.  
  1032. - -----
  1033. Christopher Tate
  1034. fixer@faxcsl.dcrt.nih.gov
  1035. <http://world.std.com/~ctate/>
  1036.  
  1037. +++++++++++++++++++++++++++
  1038.  
  1039. >From jens_alfke@powertalk.apple.com (Jens Alfke)
  1040. Date: Fri, 24 Mar 1995 18:27:46 GMT
  1041. Organization: Apple Computer, Inc.
  1042.  
  1043. In article <TomCondon-2303950958460001@mac890.kip.apple.com>,
  1044. TomCondon@aol.com (Thomas P. Condon) wrote:
  1045.  
  1046. > I don't think Jens Alfke understood what was being asked.
  1047. > The simple answer of why not to do this is that a call to a member
  1048. > function always passes an implicit "this" on the stack.
  1049.  
  1050. There are two answers to this. HandleObjects don't have this problem at
  1051. all, since the 'this' value passed to the method is a _handle_ to the
  1052. object, not a pointer. The dereferencing of the handle is done implicitly
  1053. whenever 'this' is dereferenced.
  1054.  
  1055. Regular C++ objects that live inside a relocatable block do have the
  1056. problem you described. But this is just Mac Programming 101: If you pass a
  1057. pointer into a relocatable block to a function that can move memory, you
  1058. must lock the block down first. The fact that the 'this' pointer is
  1059. invisible makes this a wee bit more subtle, but no more than the 'with'
  1060. construct in Pascal, which also introduces invisible pointers.
  1061.  
  1062.  
  1063. Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  1064.                                            OpenDoc info: FTP to CILabs.org
  1065.  
  1066.          Visit Scenic Flood Control Dam No. 3.      
  1067.  
  1068. +++++++++++++++++++++++++++
  1069.  
  1070. >From Joe Francis <Joe.Francis@dartmouth.edu>
  1071. Date: 24 Mar 1995 22:19:04 GMT
  1072. Organization: Smooth Roo Software
  1073.  
  1074. In article <3kv7oo$rgk@newsbf02.news.aol.com> ALTURA, altura@aol.com writes:
  1075. >Is this legal? (by legal, I'm mean ARM compliant and portable):
  1076. >
  1077. >class foo_c
  1078. >{
  1079. >
  1080. >public:
  1081. >   ....
  1082. >   virtual void a_virtual_func(void);
  1083. >
  1084. >};
  1085. >
  1086. >void foo(void)
  1087. >{
  1088. >  foo_c*     foo_ptr = new foo_c();
  1089. >
  1090. >  Handle      foo_h = NewHandle(sizeof(foo_c));
  1091. >  if ( foo_h )
  1092. >    BlockMove((Ptr)foo_ptr, *foo_h, sizeof(foo_c));
  1093. >}
  1094. >
  1095. >And then later on...
  1096. >
  1097. >HLock(foo_h);
  1098. >foo_c*    foo_ptr = (foo_c*)*foo_h;
  1099. >foo_ptr->a_virtual_func();
  1100. >
  1101.  
  1102. I'm not exactly sure what you mean by portable, since you use Mac-specific
  1103. calls in your example.  Do you mean portablility across mac development
  1104. environments that support C++?
  1105.  
  1106. At any rate, you can do what you do above, but there are some gotcha's.
  1107.  
  1108. First off, you have to be careful of side affects of your constructor.
  1109. Does it register itself with another class?  If so, the pointer will
  1110. be to the object you created, rather than the bitwise copy you made of
  1111. it.
  1112.  
  1113. Secondly, beware of destroying your copy.  Your compiler may make 
  1114. assumptions about where objects created with "new" live, and these
  1115. assumptions will most likely be all wrong for your hip, handle-dwelling
  1116. imposter.  :)
  1117.  
  1118. Hope this helps.
  1119.  
  1120. - ------------------------------------------------------------------------
  1121. Clap... Hop.... say "Kweepa".....
  1122. - ------------------------------------------------------------------------
  1123.  
  1124. +++++++++++++++++++++++++++
  1125.  
  1126. >From TomCondon@aol.com (Thomas P. Condon)
  1127. Date: 28 Mar 1995 18:01:27 GMT
  1128. Organization: Condon Consulting Services, Inc.
  1129.  
  1130. Geez...!  It was just a typo!!!!  Relax guys....
  1131.  
  1132. In article <95032408251200067@streetly.demon.co.uk>,
  1133. Mark@streetly.demon.co.uk wrote:
  1134.  
  1135. > In article <TomCondon-2303950958460001@mac890.kip.apple.com>, Thomas P.
  1136. Condon writes:
  1137. > > 
  1138. > > I don't think Jens Alfke understood what was being asked.
  1139. > > 
  1140. > > The simple answer of why not to do this is that a call to a member
  1141. > > function always passes an implicit "this" on the stack.  You can get into
  1142. > > the situation that 
  1143. > > 
  1144. > > 1.) You call myHandleObject->fInnerObject->DoSomething();
  1145. > > 
  1146. > > 2.) The compiler pushes the address to fInnerObject just before it calls
  1147. > > TInnerObject::DoSomething(). (Hey! This address points to the middle of a
  1148. > > relocatable block!!  DANGER!!!!)
  1149. > > 
  1150. > > 3.) Call TInnerObject::DoSomething(). OOPs!  The routine
  1151. > > TInnerObject::DoSomething() is not in memory!  The segment loader goes to
  1152. > > work!  Loads the segment! Moves memory! Moves myHandle! Address pushed on
  1153. > > the stack is garbage now!!!
  1154. > > 
  1155. > > 4.) KABOOM!
  1156. > I dont think Thomas P. Condon thought about his answer:-)
  1157. > From the syntax, fInnerObject is a pointer (or perhaps a handle) to an
  1158. object. So there is no 
  1159. > problem.
  1160. > Now if he had written
  1161. >         myHandleObject->fInnerObject.DoSomething();
  1162. > 2),3) and 4) would be valid (unless of course fInnerObject was a
  1163. reference to an object)
  1164. > Mark Williams
  1165.  
  1166. +++++++++++++++++++++++++++
  1167.  
  1168. >From S.W.Lay@damtp.cam.ac.uk (Steve Lay)
  1169. Date: Wed, 29 Mar 1995 16:37:59 +0100
  1170. Organization: DAMTP, Cambridge University
  1171.  
  1172.  
  1173. One of the simplest ways to use Mac Handles is to override the new and
  1174. delete handlers for a class, for example by subclassing from a class like
  1175. CHandleThing described below.
  1176.  
  1177. Once the object is unlocked you'll need to be careful about not using the
  1178. object pointer in all the usual situations including cross-segment calls. 
  1179. For this reason the source provides Lock/Unlock functions which exchange a
  1180. CHandleThingPtr for a Handle and vice versa.  A better version of these
  1181. two routines would use HGetState and HSetState (to allow nested calls) and
  1182. would probably be a constructor/destructor pair of a separate object.
  1183.  
  1184. There are of course still gotcha's.  Here's one or two:
  1185.  
  1186. (1) All notion of type is lost when converting to a Handle (you could fix
  1187. this though).
  1188.  
  1189. (2) Although you'll realise that you can only Lock and Unlock CHandleThing
  1190. objects if they were allocated by their own new operator this is not
  1191. enforced.  
  1192.  
  1193. (3) The code which uses the new operator needs to be able to see
  1194. CHandleThing::operator new, which means that sub-classes must inherit from
  1195. it (or a sub-class of it) 'publicly'.
  1196.  
  1197. (4) As given, the Lock/Unlock may fail in some situations.  To my
  1198. knowledge, the return value of CHandleThing::operator new is not required
  1199. to be the same as the pointer used to refer to the instance.  For example,
  1200. with multiple inheritance the compiler could arrange the classes in memory
  1201. in such a way that CHandleThing was not first.  Therefore the method wont
  1202. be very portable between compilers.
  1203.  
  1204. Although crude I've used this kind of method quite a bit without too much
  1205. trouble.
  1206.  
  1207. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1208. Source from memory, apologies for typos etc....
  1209.  
  1210.  
  1211. typedef class CHandleThing {
  1212.     public:
  1213.     void *operator new (size_t nBytes);
  1214.     void operator delete (void *p);
  1215.     static Handle UnlockHandleThing (CHandleThingPtr hThing);
  1216.     static CHandleThingPtr LockHandleThing (Handle h);
  1217.     } *CHandleThingPtr;
  1218.  
  1219. void *CHandleThing::operator new (size_t nBytes)
  1220. {
  1221. Handle h=NewHandle(nBytes);
  1222. if (h) {
  1223.     MoveHHi(h);
  1224.     HLock(h);
  1225.     return (void*)*h;
  1226.     }
  1227. else {
  1228.     //  Call error handler if desired...
  1229.     return nil;
  1230.     }
  1231. }
  1232.  
  1233.  
  1234. void CHandleThing::operator delete (void *p)
  1235. {
  1236. if (p) {
  1237.     Handle h=RecoverHandle((Ptr)p);
  1238.     DisposHandle(h);
  1239.     }
  1240. }
  1241.  
  1242.  
  1243. Handle CHandleThing::UnlockHandleThing (CHandleThingPtr hThing)
  1244. {
  1245. Handle h=RecoverHandle((Ptr)p);
  1246. HUnlock(h);
  1247. return h;
  1248. }
  1249.  
  1250.  
  1251. CHandleThingPtr CHandleThing::LockHandleThing (Handle h)
  1252. {
  1253. MoveHHi(h);
  1254. HLock(h);
  1255. return (CHandleThingPtr)*h;
  1256. }
  1257.  
  1258. -- 
  1259. Steve Lay
  1260. S.W.Lay@damtp.cam.ac.uk
  1261. http://www.amtp.cam.ac.uk/icrd
  1262.  
  1263. ---------------------------
  1264.  
  1265. >From Glenn Clingroth <gcling@sdu.com>
  1266. Subject: Getting a printer's bit depth
  1267. Date: 27 Mar 1995 22:24:20 GMT
  1268. Organization: Software Designs Unlimited Inc.
  1269.  
  1270. Hi,
  1271.  
  1272. How do you go about determining the bit depth of the printer's GrafPort?
  1273. Or this may
  1274. be the wrong question since I need to know whether the user has selected
  1275. color/grayscale
  1276. or black & white from the printer's job dialog. Is there a generic way of
  1277. doing this? Like
  1278. will I be able to tell this same information on StyleWriters,
  1279. ImageWriters, and HP printers?
  1280.  
  1281. Basically, I want to make printing as simple as possible for the user and
  1282. print a halftone
  1283. image when that is applicable, but IM-Printing doesn't seem to have the
  1284. answers I'm
  1285. looking for.
  1286.  
  1287. Thanks,
  1288.  
  1289. Glenn Clingroth
  1290. Software Designs Unlimited
  1291.  
  1292. +++++++++++++++++++++++++++
  1293.  
  1294. >From demos@amug.org (Demos)
  1295. Date: Mon, 27 Mar 1995 23:41:19 -0600
  1296. Organization: University of Utah
  1297.  
  1298. In article <3l7duk$1kv@redstone.interpath.net>, Glenn Clingroth
  1299. <gcling@sdu.com> wrote:
  1300. > Glenn Clingroth
  1301. > Software Designs Unlimited
  1302.  
  1303. Hi Gelnn, 
  1304. As far as I can tell, printer's bit depth for our LaserWriter is 8, you
  1305. can check this by converting THPrPort to CGrafPtr and looking at its
  1306. fields. However, i am not 100% sure how it all works, maybe it depends on
  1307. the depth of your main device monitor. Hell knows.. :)
  1308.  
  1309. Demos
  1310.  
  1311. -- 
  1312. Demos <demos@amug.org>
  1313.  
  1314. +++++++++++++++++++++++++++
  1315.  
  1316. >From wickberg@rbi.com (Andreas Wickberg)
  1317. Date: Thu, 30 Mar 1995 20:46:01 -0800
  1318. Organization: RBI Software Systems
  1319.  
  1320. In article <3l7duk$1kv@redstone.interpath.net>, Glenn Clingroth
  1321. <gcling@sdu.com> wrote:
  1322. > Or this may
  1323. > be the wrong question since I need to know whether the user has selected
  1324. > color/grayscale
  1325. > or black & white from the printer's job dialog. Is there a generic way of
  1326. > doing this?
  1327.  
  1328. Just check the GrafPort you get back from PrOpenDoc. It's going to be an
  1329. old style GrafPort (portBits.rowBytes >= 0) if the user chose Black and
  1330. White, or a CGrafPort if color/gray scale was selected. As a matter of
  1331. fact, that _is_ the semantics of B&W / C&G, you get the old quickdraw
  1332. colors in black and white mode.
  1333.  
  1334. Andreas
  1335.  
  1336. ---------------------------
  1337.  
  1338. >From mick@badboy.iprolink.ch ()
  1339. Subject: Good Mac software Installer
  1340. Date: 18 Mar 1995 15:31:13 GMT
  1341. Organization: Internet ProLink
  1342.  
  1343. I'm looking for a program that can help me build a simple install
  1344. file for the Mac.  I just want to package up some already existing
  1345. programs and install them in the correct place.  I bought disk doubler
  1346. and it does most of what I need, but I would like to place some files
  1347. in already existing folders (like extensions) rather than ask the
  1348. user to do it.  Is there something out there that can get me going?
  1349.  
  1350. Thanks for your help,
  1351. --
  1352. Mickey
  1353.  
  1354. +++++++++++++++++++++++++++
  1355.  
  1356. >From altura@aol.com (ALTURA)
  1357. Date: 18 Mar 1995 13:07:58 -0500
  1358. Organization: America Online, Inc. (1-800-827-6364)
  1359.  
  1360. > I just want to package up some already existing
  1361. > programs and install them in the correct place.
  1362.  
  1363. I like Developer Vise from MindVision.
  1364.  
  1365. ==========================
  1366. Jordan Zimmerman
  1367. jordanz@altura.com
  1368. http://www.altura.com/jordanz/home.html
  1369. Who is John Galt?
  1370.  
  1371. +++++++++++++++++++++++++++
  1372.  
  1373. >From meanen@acs.bu.edu (Blake)
  1374. Date: Sat, 18 Mar 1995 18:26:22 -0500
  1375. Organization: Boston University
  1376.  
  1377. Smaller Installer is cheap
  1378.  
  1379. -- 
  1380.     /\      /\                /\               /\   /\
  1381.    /^^\/\  /  \  Blake A. Mitchell        /\ Boston University  /\
  1382.   /   /^^\/^^^^\ 617/352-8597     \  /\  /^^\700 Commonwealth Ave.\
  1383.  /   /    \/\   \meanen@acs.bu.edu \/^^\/   /Box 3164   \     /^^^^\
  1384. /   /      \ \   http://acs2.bu.edu:3795\  / Boston, MA  02215      \
  1385.  
  1386. +++++++++++++++++++++++++++
  1387.  
  1388. >From tulip@tiac.net (Ed Anson)
  1389. Date: Sun, 19 Mar 1995 12:27:22 -0500
  1390. Organization: Tulip Software
  1391.  
  1392. In article <3keuc1$bjc@badboy.iprolink.ch>, mick@iprolink.ch wrote:
  1393.  
  1394. > I'm looking for a program that can help me build a simple install
  1395. > file for the Mac.  I just want to package up some already existing
  1396. > programs and install them in the correct place.  I bought disk doubler
  1397. > and it does most of what I need, but I would like to place some files
  1398. > in already existing folders (like extensions) rather than ask the
  1399. > user to do it.  Is there something out there that can get me going?
  1400.  
  1401. Aladdin's StuffIt InstallerMaker does everything you need and more. It is
  1402. especially good at placing things into existing folders and can even
  1403. determine which folders based on the system version that is running (6 vs
  1404. 7).
  1405.  
  1406. - --------------------
  1407. Ed Anson            MediaTree: multimedia outline editor & catalog
  1408. Tulip Software
  1409. Andover, MA 01810   For details, check out my WWW page:
  1410. U.S.A.              <http://www.tiac.net/users/tulip/home.html>
  1411.  
  1412. +++++++++++++++++++++++++++
  1413.  
  1414. >From isis@netcom.com (Mike Cohen)
  1415. Date: Mon, 20 Mar 1995 00:31:53 GMT
  1416. Organization: ISIS International
  1417.  
  1418. mick@badboy.iprolink.ch () writes:
  1419.  
  1420. >I'm looking for a program that can help me build a simple install
  1421. >file for the Mac.  I just want to package up some already existing
  1422. >programs and install them in the correct place.  I bought disk doubler
  1423. >and it does most of what I need, but I would like to place some files
  1424. >in already existing folders (like extensions) rather than ask the
  1425. >user to do it.  Is there something out there that can get me going?
  1426.  
  1427. Look at Aladdin's InstallerMaker. You can find a demo at ftp.netcom.com in
  1428. /pub/le/leonardr.
  1429.  
  1430. -- 
  1431. Mike Cohen - isis@netcom.com
  1432. NewtonMail, eWorld: MikeC / ALink: D6734 / AOL: MikeC20
  1433. Home Page: ftp://ftp.netcom.com/pub/is/isis/home.html
  1434. PUSH THE BUTTON, FRANK... OR SOMEONE?
  1435.  
  1436. +++++++++++++++++++++++++++
  1437.  
  1438. >From mindvision@mindvision.com (Steve Kiene)
  1439. Date: 20 Mar 1995 05:57:09 GMT
  1440. Organization: MindVision Software
  1441.  
  1442. In article <3keuc1$bjc@badboy.iprolink.ch>, mick@iprolink.ch wrote:
  1443.  
  1444. > I'm looking for a program that can help me build a simple install
  1445. > file for the Mac.  I just want to package up some already existing
  1446. > programs and install them in the correct place.  I bought disk doubler
  1447. > and it does most of what I need, but I would like to place some files
  1448. > in already existing folders (like extensions) rather than ask the
  1449. > user to do it.  Is there something out there that can get me going?
  1450.  
  1451. Developer VISE Lite from MindVision Software can do this and a lot more.
  1452. It's available for a one-time license fee of $295. A demo is available
  1453. from ftp.mindvision.com. Developer VISE is the installer of choice at
  1454. companies like Claris, Adobe, and Intuit.
  1455.  
  1456. Steve Kiene
  1457. MindVision Software
  1458.  
  1459. +++++++++++++++++++++++++++
  1460.  
  1461. >From dfleck@wacom.com (Dave Fleck)
  1462. Date: Mon, 20 Mar 1995 09:56:08 -0800
  1463. Organization: Wacom Technology Corp.
  1464.  
  1465. In article <3keuc1$bjc@badboy.iprolink.ch>, mick@iprolink.ch wrote:
  1466.  
  1467. > I'm looking for a program that can help me build a simple install
  1468. > file for the Mac.  I just want to package up some already existing
  1469. > programs and install them in the correct place.  I bought disk doubler
  1470. > and it does most of what I need, but I would like to place some files
  1471. > in already existing folders (like extensions) rather than ask the
  1472. > user to do it.  Is there something out there that can get me going?
  1473. > Thanks for your help,
  1474. > --
  1475. > Mickey
  1476.  
  1477. Smaller Installer is a good value. I really liked Apple's installer - but
  1478. licensing went from $50 per year to $2000 per year per language ($14000
  1479. for us!) so we dropped it. I understand even Claris doesn't use the Apple
  1480. installer. Writing scripts for Apple's installer isn't too bad so I never
  1481. found a need to use any of the installer script makers and you still have
  1482. to license the Apple installer! That only leaves a couple of installers
  1483. left, and many of those have licens fees similar to Apples. There are demo
  1484. versions of Smaller Installer available. I believe you can reach them at
  1485. cyclos@applelink.apple.com.
  1486.  
  1487. Dave
  1488. - ---------------------------------------------------------------
  1489. Dave Fleck   email:dfleck@wacom.com      phone:360-750-8882x154
  1490. Wacom Technology Corp.                          sales@wacom.com
  1491. 501 S.E. Columbia Shores Blvd, #300           support@wacom.com
  1492. Vancouver, WA 98661                           WWW/FTP:wacom.com
  1493. - ----------------------------------------------------------------
  1494.  
  1495. +++++++++++++++++++++++++++
  1496.  
  1497. >From mindvision@mindvision.com (Steve Kiene)
  1498. Date: 21 Mar 1995 11:50:09 GMT
  1499. Organization: MindVision Software
  1500.  
  1501. In article <dfleck-2003950956080001@204.119.25.66>, dfleck@wacom.com (Dave
  1502. Fleck) wrote:
  1503.  
  1504. > Smaller Installer is a good value. I really liked Apple's installer - but
  1505. > licensing went from $50 per year to $2000 per year per language ($14000
  1506. > for us!) so we dropped it. I understand even Claris doesn't use the Apple
  1507. > installer. Writing scripts for Apple's installer isn't too bad so I never
  1508. > found a need to use any of the installer script makers and you still have
  1509. > to license the Apple installer! That only leaves a couple of installers
  1510. > left, and many of those have licens fees similar to Apples. There are demo
  1511. > versions of Smaller Installer available. I believe you can reach them at
  1512. > cyclos@applelink.apple.com.
  1513.  
  1514. You are correct. Claris is phasing out use of the Apple Installer and is
  1515. now using Developer VISE. Apple has (again) revised their licensing, and
  1516. now you have to pay on a per copy basis. I don't remember the specifics.
  1517. Unless you have only one product and you are distributing a really small
  1518. number of copies of your software in a one-shot deal, Developer VISE Lite
  1519. is probably one of the least expensive installers. It's available for a
  1520. one-time license fee of $295. Considering the ease of use of Developer
  1521. VISE as compared to Smaller Installer (which costs a minimum of $200),
  1522. it's close enough to where you should take a look at all the products and
  1523. decide which product works best for your individual needs. You can find
  1524. Developer VISE by e-mailing me, or trying ftp.mindivision.com (I'm just
  1525. getting our ftp site up and running, so it may be down periodically until
  1526. I get it all figured out).
  1527.  
  1528. Steve Kiene
  1529. MindVision Software
  1530.  
  1531. +++++++++++++++++++++++++++
  1532.  
  1533. >From mindvision@mindvision.com (Steve Kiene)
  1534. Date: 22 Mar 1995 11:22:02 GMT
  1535. Organization: MindVision Software
  1536.  
  1537. In article <3kmuc4$mti@deep.rsoft.bc.ca>, first.ascent@mindlink.bc.ca
  1538. (Alex Curylo) wrote:
  1539.  
  1540. > Wow, $5 cheaper than DragInstall! What was cut out to make it "Lite"?
  1541.  
  1542.  
  1543. Basically it's the same as the old version of the regular Developer VISE
  1544. (which has a lot more functionality than DragInstall). Here's the text I
  1545. pulled from the programming notes:
  1546.  
  1547. Developer VISE Lite 
  1548. Missing Features List
  1549.  
  1550. 1. No uncompressed files on install diskettes 
  1551.    Files can not be stored by Developer VISE as Finder accessible on floppy
  1552.  
  1553. 2. No Billboards
  1554.  
  1555. 3. Only 32 packages
  1556.  
  1557. 4. Translator Applications can not be created
  1558.    Translator Applications provide a way to easily translate the data
  1559. you9ve entered in your archive to another language.
  1560.  
  1561. 5. No Dynamic Localization Features
  1562.    Simplifies the archive creation process for different languages via
  1563. Import-update feature.
  1564.  
  1565. 6. No Archive Reports
  1566.  
  1567. 7. No Advanced Settings  
  1568.    Advanced Settings are accessed via the Preferences window of the
  1569. regular version of Developer VISE. The following list describes each
  1570. Advanced Setting option.
  1571.  
  1572. a. View by Generic Icon in Archive Window
  1573. When selected, displays generic icons for files and folders in the Archive
  1574. window, the Add window, and the Update Archive window. When not selected,
  1575. the icons for each item that appear on the Desktop are displayed.
  1576.  
  1577. b. Show Easy Install Package in Custom Install
  1578. When selected, Easy Install appears as a selectable item in the Custom
  1579. Install window.
  1580.  
  1581. c.  Don9t Recompress option. 
  1582. When selected, additional compression is not performed when creating an
  1583. installer. This option can dramatically speed up building time, and will
  1584. make the installer slightly larger.
  1585.  
  1586. d. No Restart Warnings in the Installer
  1587. When selected, the restart warning dialog appearing prior to installation
  1588. is removed (under scenarios causing a restart warning dialog box to
  1589. occur). The restart suggestion/option dialogs are still provided after the
  1590. installation is completed.
  1591.  
  1592. e. Maximize Space on Diskette 
  1593. Disk space is maximized when writing the installer segment/s to floppy.
  1594. This results in approximately 14K of extra space available per disk. It
  1595. also reduces the amount of free space left on disk.
  1596.  
  1597. f. Show Installer Window in background during Install
  1598. The In Progress install dialog is drawn on top of the Easy
  1599. Install/Customized window.
  1600.  
  1601. g. Display Package Names in Progress Dialog 
  1602. Option shows the package name instead of the file name during the
  1603. installation process. 
  1604.  
  1605. h. Don9t Display Read Me during Installer Launch
  1606. The Read Me will accessible only via a Read Me
  1607. Install/Custom Install windows.
  1608.  
  1609. i. Check Gestalts on Custom Install
  1610. Forces the installer to honor Gestalt settings (made from Get Info.
  1611. section) for items installed via Custom Install. The Custom Install
  1612. previously ignored file level Gestalt settings.
  1613.  
  1614. j. Allow Duplicate Resources
  1615. Allows you to have resources with the same id as the installer (used to
  1616. replace the Developer VISE installer icon with your own custom icon).
  1617.  
  1618. k. Easy Install Show Sizes
  1619. Shows the disk space available and disk space needed in the Easy Install
  1620. window - see frequently asked questions in manual for more details.
  1621.  
  1622. l. Replace Disk Pop-up Menu with Select Folder Button
  1623. Two buttons (Select Folder & Switch Disk) appear in the Easy
  1624. Install/Custom Install windows . The installer normally reveals a location
  1625. pop-up menu & a Switch Disk button (provided pop-up menu items are: Select
  1626. Folder
  1627.  
  1628. m. Ask User Once on Fat Binary Installs
  1629. Allows for easy creation of packages such as 3Program X = PowerPC2 &
  1630. 3Program X - 68K2. You simply assign the same files to both packages, but
  1631. change the Install Fat Binary options for each.
  1632.  
  1633. n. Force Creation of Moved Items Folder
  1634.  
  1635. o. Display Billboards by Package, not by Disk
  1636. Allows the billboard pict file shown above the installer application9s in
  1637. progress bar to be drawn according to the billboard/s assigned to
  1638. package/s.
  1639.  
  1640. p. Display Billboards in Separate Window
  1641. When selected, billboards will be displayed above the progress dialog, not
  1642. on top of it. Please note that the size of the screen is not checked, so
  1643. make sure that your billboard will fit on all screen sizes if selecting
  1644. this option.
  1645.  
  1646. q. Show Remove in Installer
  1647. This feature requires you to add your own external code for implementation
  1648.  
  1649. r. Put Log File on Root of Volume
  1650.  
  1651.  
  1652. Steve Kiene
  1653. MindVision Software
  1654.  
  1655. +++++++++++++++++++++++++++
  1656.  
  1657. >From dryan@mactemps.com (Dennis Ryan)
  1658. Date: Thu, 23 Mar 1995 23:10:29 -0500
  1659. Organization: MacTemps, Inc.
  1660.  
  1661. In article <mindvision-2003950003230001@earth.mindvision.com>,
  1662. mindvision@mindvision.com (Steve Kiene) wrote:
  1663.  
  1664. > In article <3keuc1$bjc@badboy.iprolink.ch>, mick@iprolink.ch wrote:
  1665. > I'm looking for a program that can help me build a simple install
  1666. > file for the Mac.  I just want to package up some already existing
  1667. > programs and install them in the correct place.  I bought disk doubler
  1668. > and it does most of what I need, but I would like to place some files
  1669. > in already existing folders (like extensions) rather than ask the
  1670. > user to do it.  Is there something out there that can get me going?
  1671.  
  1672.  
  1673. try alladin's insstallermaker. i dont know what the licencing fees are
  1674. though. but it does all that you are asking
  1675.  
  1676. +++++++++++++++++++++++++++
  1677.  
  1678. >From tulip@tiac.net (Ed Anson)
  1679. Date: Sat, 25 Mar 1995 20:20:07 -0500
  1680. Organization: Tulip Software
  1681.  
  1682. In article <dryan-2303952310290001@village.tiac.net>, dryan@mactemps.com
  1683. (Dennis Ryan) wrote:
  1684.  
  1685. > In article <mindvision-2003950003230001@earth.mindvision.com>,
  1686. > mindvision@mindvision.com (Steve Kiene) wrote:
  1687. > > In article <3keuc1$bjc@badboy.iprolink.ch>, mick@iprolink.ch wrote:
  1688. > > 
  1689. > > I'm looking for a program that can help me build a simple install
  1690. > > file for the Mac.  I just want to package up some already existing
  1691. > > programs and install them in the correct place.  I bought disk doubler
  1692. > > and it does most of what I need, but I would like to place some files
  1693. > > in already existing folders (like extensions) rather than ask the
  1694. > > user to do it.  Is there something out there that can get me going?
  1695. > try alladin's insstallermaker. i dont know what the licencing fees are
  1696. > though. but it does all that you are asking
  1697.  
  1698. To get details on licensing, call Janet Viets at Aladdin (408-761-6200).
  1699. Last I checked, you can license the installer for about $250 per year.
  1700. That's what I'm paying, anyway. I find it well worth the price.
  1701.  
  1702. - --------------------
  1703. Ed Anson            MediaTree: multimedia outline editor & catalog
  1704. Tulip Software
  1705. Andover, MA 01810   For details, check out my WWW page:
  1706. U.S.A.              <http://www.tiac.net/users/tulip/home.html>
  1707.  
  1708. +++++++++++++++++++++++++++
  1709.  
  1710. >From galanos@metrowerks.com (Greg Galanos)
  1711. Date: Sun, 26 Mar 95 12:17:19 GMT
  1712. Organization: Metrowerks Inc.
  1713.  
  1714. In Article <tulip-2503952020070001@tulip.tiac.net>, tulip@tiac.net (Ed
  1715. Anson) wrote:
  1716.  
  1717. >To get details on licensing, call Janet Viets at Aladdin (408-761-6200).
  1718. >Last I checked, you can license the installer for about $250 per year.
  1719. >That's what I'm paying, anyway. I find it well worth the price.
  1720.  
  1721. Aladdin's InstallerMaker is used in all Metrowerks CodeWarrior releases. We
  1722. build archives that are larger than 100 megabytes using IM. We broke it a
  1723. couple of times when we were doing DR1 (back in January 1994) but
  1724. considering the size of our archives and the industrial beating it took, it
  1725. has come out extremely well. Aladdin have fixed all of our outstanding
  1726. problems and the CW5 Installer of CodeWarrior was actually a pleasure to build.
  1727.  
  1728. -- Greg Galanos, president & CEO, metrowerks inc.
  1729.  
  1730. +++++++++++++++++++++++++++
  1731.  
  1732. >From Simon Fraser <s.fraser@ic.ac.uk>
  1733. Date: 30 Mar 1995 16:17:09 GMT
  1734. Organization: Imperial College, London, UK
  1735.  
  1736. > In Article <tulip-2503952020070001@tulip.tiac.net>, tulip@tiac.net (Ed
  1737. > Anson) wrote:
  1738. > >To get details on licensing, call Janet Viets at Aladdin (408-761-6200).
  1739. > >Last I checked, you can license the installer for about $250 per year.
  1740. > >That's what I'm paying, anyway. I find it well worth the price.
  1741.  
  1742. Does anyone know Aladdin's policy on share- and freeware authors
  1743. using InstallerMaker? Do they charge for that?
  1744.  
  1745. Simon Fraser
  1746. s.fraser@ic.ac.uk
  1747.  
  1748.  
  1749. +++++++++++++++++++++++++++
  1750.  
  1751. >From stevek@mindvision.com (Steve Kiene)
  1752. Date: 31 Mar 1995 01:52:41 GMT
  1753. Organization: MindVision Software
  1754.  
  1755. In article <3leli5$aon@oban.cc.ic.ac.uk>, Simon Fraser <s.fraser@ic.ac.uk>
  1756. wrote:
  1757.  
  1758. > Does anyone know Aladdin's policy on share- and freeware authors
  1759. > using InstallerMaker? Do they charge for that?
  1760.  
  1761. Developer VISE from MindVision Software is free to shareware and freeware
  1762. authors. Just ask for a copy.
  1763.  
  1764. - ----------------------------------------------------------------------
  1765. Steve Kiene                              Internet: stevek@mindvision.com 
  1766. MindVision Software                                      AOL: MindVision 
  1767. 840 South 30th Street, Suite C                     AppleLink: MindVision 
  1768. P.O. Box 81886                                    CompuServe: 70253,1437 
  1769. Lincoln, NE 68510                                    Fax: (402) 477-1395 
  1770.  
  1771.            ftp://ftp.mindvision.com for demos and information.
  1772. ---------------------------
  1773.  
  1774. >From plumpto@bnr.ca (David Plumpton)
  1775. Subject: InitZone strangeness
  1776. Date: Thu, 23 Mar 1995 10:21:35 +1000
  1777. Organization: BNR Australia
  1778.  
  1779. Here's the situation:
  1780. I've created and locked a Handle in multifinder memory with TempNewHandle().
  1781. Later on I make a Zone in it with InitZone(), and it works fine.
  1782. Further on again, I want to throw away all the previous stuff and start again,
  1783. so I make another call to InitZone(), with *identical* parameter values to
  1784. the first call, and everything freezes up.
  1785.  
  1786. The handle is still allocated and locked.
  1787. Before the InitZone() call both times the current zone is the application zone.
  1788. Stepping into the call with Metrowerks debugger in assembler there are a few
  1789. loads and then a bl *+someBigNumber, and this is where it dies.
  1790.  
  1791. I'm using a PowerMac 6100/60 AV, System 7.5, Codewarrior 5.5, Modern Memory
  1792. Manager on.
  1793.  
  1794. Any ideas out there?
  1795.  
  1796. p.s. Did you know it's possible to create a zone with the two pointers
  1797. backwards. I did this by accident once, and InitZone() likes it, MemError()
  1798. is happy, and MaxBlock() returns a negative number. Freaky.
  1799.  
  1800. -- 
  1801. David J. Plumpton           Nobody wants my opinions.
  1802. plumpto@bnr.ca              PGP Public Key available on request.
  1803.  
  1804. +++++++++++++++++++++++++++
  1805.  
  1806. >From Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu)
  1807. Date: 23 Mar 1995 01:37:22 GMT
  1808. Organization: Dartmouth College, Hanover, NH
  1809.  
  1810. In article <plumpto-2303951021360001@47.181.192.81>
  1811. plumpto@bnr.ca (David Plumpton) writes:
  1812. > I've created and locked a Handle in multifinder memory with TempNewHandle().
  1813. > Later on I make a Zone in it with InitZone(), and it works fine.
  1814. > Further on again, I want to throw away all the previous stuff and start again,
  1815. > so I make another call to InitZone(), with *identical* parameter values to
  1816. > the first call, and everything freezes up.
  1817. > The handle is still allocated and locked.
  1818. > Before the InitZone() call both times the current zone is the application zone.
  1819. > Stepping into the call with Metrowerks debugger in assembler there are a few
  1820. > loads and then a bl *+someBigNumber, and this is where it dies.
  1821. > I'm using a PowerMac 6100/60 AV, System 7.5, Codewarrior 5.5, Modern Memory
  1822. > Manager on.
  1823. > Any ideas out there?
  1824.  
  1825. There is a new routine introduced with the Modern Memory Manager called
  1826. DisposeZone.  It is only available when the modern memory manager is
  1827. active.  So, for example, if you turn MMM off on your Power Mac, your
  1828. problem will go away.  Likewise, if you run your program on a 68K Mac
  1829. (which does not have MMM), you will not see the problem.  I think the
  1830. MMM keeps a list of zones, and so you need to tell it when a zone is
  1831. going away.  In other words, you need to call DisposeZone before
  1832. re-initing over that old zone.
  1833.  
  1834. Here's some code that I use that tests if DisposeZone is present and
  1835. then calls it if necessary:
  1836.  
  1837.  
  1838. #if USES68KINLINES
  1839. #pragma parameter __A0 DisposeZone(__D0)
  1840. #endif
  1841. extern pascal OSErr DisposeZone(THz zone)
  1842.  TWOWORDINLINE(0x701D, 0xA0A4);
  1843.  
  1844. void
  1845. dispose_zone (THz zone)
  1846. {
  1847.     if (zone->heapType & kNewStyleHeap)
  1848.         DisposeZone(zone);
  1849. }
  1850.  
  1851. DisposeZone is actually a selected routine (D0=0x1D) of _HeapDispatch
  1852. (0xA0A4).  You can check if a particular heap is "modern" by testing
  1853. bit 1 of heapType (which used to be maxNRel).  If the heap is modern,
  1854. the trap is implemented.  If the heap is not modern, then there is no
  1855. need to call DisposeZone.
  1856.  
  1857. Note that kNewStyleHeap and heapType (nee maxNRel) are both defined in
  1858. memory.h (universal headers).  DisposeZone was omitted for some reason.
  1859.  
  1860. > p.s. Did you know it's possible to create a zone with the two pointers
  1861. > backwards. I did this by accident once, and InitZone() likes it, MemError()
  1862. > is happy, and MaxBlock() returns a negative number. Freaky.
  1863.  
  1864. "Hey doc, it hurts when I do this."  ;-)  ;-)  ;-)
  1865.  
  1866. Good luck,
  1867.  
  1868. Mark.
  1869.  
  1870. - --------------------------------------------------------------------
  1871. "On the Internet, nobody knows you're a dog."   Ice Peak Form Mice Elf
  1872.                     -- cartoon in New Yorker
  1873.  
  1874. +++++++++++++++++++++++++++
  1875.  
  1876. >From grobbins@znet.com (Grobbins)
  1877. Date: Tue, 28 Mar 1995 22:06:30 -0700
  1878. Organization: Skunkworks
  1879.  
  1880. In article <3kqjci$pcq@dartvax.dartmouth.edu>,
  1881. Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu) wrote:
  1882. >There is a new routine introduced with the Modern Memory Manager called
  1883. >DisposeZone.  It is only available when the modern memory manager is
  1884. >active.
  1885.  
  1886. Since Apple hasn't documented this, it's probably best to avoid making the
  1887. call.  The modern memory manager will dispose of a zone contained in a
  1888. Handle or Pointer when the block is disposed with DisposeHandle or
  1889. DisposePtr.  So if you create a heap zone, put it in a memory manager
  1890. block (in a temp handle is fine) and dispose of the block when you're done
  1891. with the heap. Don't put heap zones on the stack or dispose of them by
  1892. simply overwriting them.
  1893.  
  1894. Grobbins                           grobbins@znet.com
  1895.  
  1896. ---------------------------
  1897.  
  1898. >From kent.soerensen@dkb.dk (KENT SOERENSEN)
  1899. Subject: Postponing AE reply ?
  1900. Date: Wed, 22 Mar 95 01:37:00 +0100
  1901. Organization: Danish Key Board BBS - Copenhagen Denmark - +45 3325 5600
  1902.  
  1903.  
  1904. How do I "postpone" replying to an AppleEvent ?
  1905.  
  1906. It appears that a reply to an AppleEvent must be completed inside the 
  1907. function that is called by AEProcessAppleEvent. 
  1908.  
  1909. I've written a plug-in to extend the scripting ability of an existing 
  1910. application. When it processes the AppleEvent, the plug-in is called 
  1911. differently than when it is normally called by the application. Therefore 
  1912. it doesn't have access to the information it needs to fully process the 
  1913. event. So I store the parameters in a structure, return from the function, 
  1914. and look at the parameters in the next normal invocation. So far so good.
  1915.  
  1916. However, now I can't reply to the original AppleEvent... 
  1917.  
  1918. The sender of the event is AppleScript, and I'd really like if someone out 
  1919. there could give me some advice, on how to return information so that 
  1920. AppleScript can use it.
  1921.  
  1922. Thanks in advance.
  1923.  
  1924. Bye,
  1925.   Kent
  1926.  
  1927.  
  1928. - -
  1929. TIMM (1.0e)  
  1930. Real Programmers never work 9 to 5. If any real programmers are around at 
  1931. 9 am, it's because they were up all night.
  1932.  
  1933. +++++++++++++++++++++++++++
  1934.  
  1935. >From paul.hoffman@umich.edu (Paul M. Hoffman)
  1936. Date: Thu, 23 Mar 1995 11:42:42 -0500
  1937. Organization: University of Michigan
  1938.  
  1939. In article <8A5F061.16AD001071.uuout@dkb.dk>, kent.soerensen@dkb.dk (KENT
  1940. SOERENSEN) wrote:
  1941.  
  1942. > How do I "postpone" replying to an AppleEvent ?
  1943.  
  1944. Ouch!  I always hate to see this question, because I had to get my brain
  1945. around this thorny problem once and having done so slipped into a sort of
  1946. bruised but blissful forgetfulness.  The short answer is, use
  1947. AESuspendTheCurrentEvent to suspend the event and AEResumeTheCurrentEvent
  1948. to resume processing.  My understanding of this issue may not be
  1949. exhaustive (or even *entirely* correct), so caveat emptor etc., but FWIW
  1950. read on for more info.
  1951.  
  1952. > It appears that a reply to an AppleEvent must be completed inside the 
  1953. > function that is called by AEProcessAppleEvent. 
  1954.  
  1955. Not necessarily -- it depends on what the caller (the process that sent
  1956. the Apple Event) expects in the way of a reply.  If it's *waiting* for a
  1957. reply (i.e., it called AESend with the kAEWaitReply flag set in the
  1958. sendMode parameter) then it will get an errAETimeout (-1712) error if you
  1959. suspend handling and don't resume (and finish) it soon enough.  (Come to
  1960. think of it, it may get an errAETimeout error regardless.  Read Inside
  1961. Mac: Interapplication Communication for holy writ.)
  1962.  
  1963. If, however, it expects to receive a reply event, (i.e., it called AESend
  1964. with the kAEQueueReply flag set in sendMode), then you can suspend the
  1965. event, then later resume it and still return a meaningful reply.
  1966.  
  1967. > I've written a plug-in to extend the scripting ability of an existing 
  1968. > application. When it processes the AppleEvent, the plug-in is called 
  1969. > differently than when it is normally called by the application. Therefore 
  1970. > it doesn't have access to the information it needs to fully process the 
  1971. > event.
  1972.  
  1973. Well, if possible I would change this so that there are optional
  1974. parameters to the event.  May not be possible, I know, but...  Ideally
  1975. everything's factored so that you don't have to get around this kind of
  1976. thing.  [Yes, I do believe we live in an ideal universe, but who's ideal
  1977. is it? -- not mine!]
  1978.  
  1979. > So I store the parameters in a structure, return from the function, 
  1980. > and look at the parameters in the next normal invocation. So far so good.
  1981. > However, now I can't reply to the original AppleEvent... 
  1982. > The sender of the event is AppleScript, and I'd really like if someone out 
  1983. > there could give me some advice, on how to return information so that 
  1984. > AppleScript can use it.
  1985.  
  1986. There may be some specific restrictions imposed on suspending and resuming
  1987. events in your case.  The script that sends you the event may require a
  1988. "with timeout of n seconds"/"end timeout" block; there are other tricky
  1989. things I won't go into here.  Definitely read Inside Mac: Interapplication
  1990. Communication carefully -- the relevant pages are (most important) 4-85 to
  1991. 4-88 and (for AESend) 5-37 to 5-41.  Then try it and if it works, great.
  1992.  
  1993. OK, here's my code (adapted from some Dragonsmith code).  It's worked well
  1994. so far, but then it's really only been tested with multiple 'odoc' events
  1995. from the Finder.  The idea is that you have to keep your own queue of
  1996. waiting-to-be-processed Apple Events and check it promptly when you're
  1997. (more or less) idle.  This is what my 'odoc' handler does:
  1998.  
  1999.    // If we're already processing an Apple event, suspend this event
  2000.    if (runState & maskBusy) {
  2001.       err = aeQueue->Put (event, reply, handler, refcon);
  2002.       if (err == noErr) {
  2003.          numAEsPending++;
  2004.          err = AESuspendTheCurrentEvent (event);
  2005.       }
  2006.       return err;
  2007.    } else {
  2008.       ... actually handle the event and return an error here ...
  2009.    }
  2010.  
  2011. Then my main event loop does something like this:
  2012.  
  2013.    WaitNextEvent (everyEvent, &event, sleepTime, NULL);
  2014.    DoEvent (&event);
  2015.    if (numAEsPending > 0) {
  2016.       err = aeQueue->Get (&event, &reply, &handler, &refcon);
  2017.       if (err == noErr && handler != NULL)
  2018.          err = AEResumeTheCurrentEvent (&event, &reply, handler, refcon);
  2019.       if (--numAEsPending < 0)
  2020.         numAEsPending = 0;
  2021.    } else
  2022.       DoIdle ();
  2023.  
  2024. Here, aeQueue is an object of my AppleEventQueue class. 
  2025. AEResumeTheCurrentEvent results in the Apple Event handler being called
  2026. all over again.  This is why it's called *after* handling the event
  2027. returned by WNE -- putting it between WNE and DoEvent would be a Very Bad
  2028. Thing.  [Of course, if you want to handle events in reverse order, just
  2029. use a stack instead of a queue -- neat, huh?!]
  2030.  
  2031. [VERY IMPORTANT: When you queue the event -- which my code does with
  2032. aeQueue->Put (...) -- you must save a copy of the Apple Event itself,
  2033. *not* a pointer to it.  Likewise for its reply event.  My code may *look*
  2034. like it's queuing pointers, but it's really queuing the event data pointed
  2035. to by the pointers.  (My AppleEventQueue::Put essentially just allocates a
  2036. handle, crams everything into it, and sticks it at the end of a queue;
  2037. AppleEventQueue::Get sucks everything out of the frontmost item in the
  2038. queue, disposes of the storage it occupied, and removes the item from the
  2039. queue.)]
  2040.  
  2041. > Thanks in advance.
  2042.  
  2043. No problem.  I hope this helps.  It's good to refresh my memory on it, anyhow.
  2044.  
  2045. Paul.
  2046.  
  2047. -- 
  2048. Paul Hoffman            +-----+ E-mail: paul.hoffman@umich.edu
  2049. Taubman Medical Library | pmh | WWW: http://www.umich.edu/~nkuitse/
  2050. University of Michigan  +-----+ "Dragons do not enter into this message"
  2051.  
  2052. +++++++++++++++++++++++++++
  2053.  
  2054. >From amfahr@pharos-tech.com (Jeff Amfahr)
  2055. Date: Tue, 28 Mar 1995 21:13:31 GMT
  2056. Organization: Pharos Technologies
  2057.  
  2058. Take a look at AESuspendEvent and AEResumeEvent. They should do the trick
  2059. for you.
  2060.  
  2061. -- 
  2062.  "This isn't right.  This isn't even wrong."
  2063.                                 Wolfgang Pauli
  2064.  
  2065. ---------------------------
  2066.  
  2067. >From weibel@teal.csn.net (weibel)
  2068. Subject: Simple Sound
  2069. Date: 29 Mar 1995 02:05:43 GMT
  2070. Organization: Colorado Supernet
  2071.  
  2072. How does one play a sound resource in a program?  If possible 
  2073. please show a simple snippet (in C) that will preform this.
  2074.  
  2075. Thank You
  2076.   David
  2077.  
  2078. +++++++++++++++++++++++++++
  2079.  
  2080. >From Francois-Regis.Degott@imag.fr (F. Degott)
  2081. Date: 29 Mar 1995 12:49:08 GMT
  2082. Organization: LMC-IMAG Grenoble France
  2083.  
  2084. In article <3laf9n$fb7@news-2.csn.net>, weibel@teal.csn.net (weibel) wrote:
  2085.  
  2086. > How does one play a sound resource in a program?  If possible 
  2087. > please show a simple snippet (in C) that will preform this.
  2088. > Thank You
  2089. >   David
  2090.  
  2091. Hi David,
  2092.  
  2093. this is a sample procedure to play a resource sound (in pascal, sorry...).
  2094.  
  2095.  procedure PlaySound;
  2096.   const
  2097.      SoundResType = 'snd ';{snd res type: 4 caracters, the last is a space}
  2098.      SoundResID = 1000;{the sound to play}
  2099.   var
  2100.      sndHdl: Handle;
  2101.      err: integer;
  2102.  begin
  2103.     sndHdl := GetResource(SoundResType,SoundResID);
  2104.     if sndHdl <> nil then
  2105.      begin
  2106.         err := SndPlay(nil,sndHdl, true);
  2107.         ReleaseResource(sndHdl);
  2108.      end;
  2109.  end;{PlaySound}
  2110.  
  2111. Bye.
  2112.  
  2113. -- 
  2114. __________________________________________
  2115. F.R. Degott  (Francois-Regis.Degott@imag.fr)
  2116. Lab. LMC-IMAG - Univ. Joseph Fourier - Grenoble - France
  2117.  
  2118. ---------------------------
  2119.  
  2120. >From d87-vik@nada.kth.se (Ville Kdrkkdinen)
  2121. Subject: TETextBox - How many lines ?
  2122. Date: Mon, 27 Mar 1995 11:08:45 +0100
  2123. Organization: FOA 11
  2124.  
  2125.  
  2126. Hello world !
  2127.  
  2128. Today I use the method below to output text to the screen.
  2129.  
  2130. void AReportPane::DrawComment(Point start,Handle textHandle) {
  2131. Rect rect;
  2132. long length;
  2133.  
  2134.    rect.left = start.h;
  2135.    rect.top = start.v;
  2136.    rect.bottom = 32000;
  2137.    rect.right = pageRect.right - 20;
  2138.    
  2139.    length = GetHandleSize(textHandle);
  2140.  
  2141.    if (length > 0) {
  2142.       TETextBox(*textHandle,length,&rect,teFlushLeft);
  2143.    } else {
  2144.       MoveTo(start.h,start.v + 12);
  2145.       DrawString("\pNo comment");
  2146.    }
  2147. }
  2148.  
  2149.  
  2150. Is there any way to get at the actual number of lines drawn (or height in
  2151. pixels) by TETextBox without getting to much involved in organizing the
  2152. text
  2153. in style runs and such.
  2154.  
  2155. The height info would be needed for further formatting purposes.
  2156.  
  2157. +++++++++++++++++++++++++++
  2158.  
  2159. >From muffinhead@ins.infonet.net (MuffinHead)
  2160. Date: 27 Mar 1995 10:53:12 GMT
  2161. Organization: Armpit Studios VII
  2162.  
  2163. In article <d87-vik-2703951108450001@ccarlson.sto.foa.se>,
  2164. d87-vik@nada.kth.se (Ville Kdrkkdinen) wrote:
  2165.  
  2166. >void AReportPane::DrawComment(Point start,Handle textHandle) {
  2167. >Rect rect;
  2168. >long length;
  2169. [...]
  2170. >   
  2171. >   length = GetHandleSize(textHandle);
  2172. >
  2173. >   if (length > 0) {
  2174. >      TETextBox(*textHandle,length,&rect,teFlushLeft);
  2175. >   } else {
  2176. >      MoveTo(start.h,start.v + 12);
  2177. >      DrawString("\pNo comment");
  2178. >   }
  2179. >}
  2180. >
  2181. >Is there any way to get at the actual number of lines drawn (or height in
  2182. >pixels) by TETextBox without getting to much involved in organizing the
  2183. >text
  2184. >in style runs and such.
  2185. >
  2186. >The height info would be needed for further formatting purposes.
  2187.  
  2188.    Since this is obviously non-styled text, you won't have to worry about
  2189. style runs. I imagine the easiest way to do this would be to create a
  2190. TEHandle with the rect used above, insert the text into that, then just
  2191. look at (**te).nLines. Multiply that by (ascent + descent + leading)
  2192. obtained from GetFontInfo for the current port (if it's the same as your
  2193. TE's.
  2194.  
  2195. Muff                                               Armpit Studios VII
  2196. Drummer, Mac geek                                       Iowa City, IA
  2197. _____________________________________________________________________
  2198. [Dorky quote under construction.]
  2199.  
  2200. +++++++++++++++++++++++++++
  2201.  
  2202. >From Francois-Regis.Degott@imag.fr (F. Degott)
  2203. Date: 30 Mar 1995 11:38:33 GMT
  2204. Organization: LMC-IMAG Grenoble France
  2205.  
  2206. In article <muffinhead-2703950455560001@s045.infonet.net>,
  2207. muffinhead@ins.infonet.net (MuffinHead) wrote:
  2208.  
  2209. > In article <d87-vik-2703951108450001@ccarlson.sto.foa.se>,
  2210. >    Since this is obviously non-styled text, you won't have to worry about
  2211. > style runs. I imagine the easiest way to do this would be to create a
  2212. > TEHandle with the rect used above, insert the text into that, then just
  2213. > look at (**te).nLines. Multiply that by (ascent + descent + leading)
  2214. > obtained from GetFontInfo for the current port (if it's the same as your
  2215. > TE's.
  2216.  
  2217. Yes, but don't forget to call TECalText before.
  2218. Bye.
  2219. __________________________________________
  2220. F.R. Degott  (Francois-Regis.Degott@imag.fr)
  2221. Lab. LMC-IMAG - Univ. Joseph Fourier - Grenoble - France
  2222.  
  2223. ---------------------------
  2224.  
  2225. >From wem53067@uxa.cso.uiuc.edu (The Bard)
  2226. Subject: [Q] Going modal-less?
  2227. Date: Thu, 30 Mar 1995 15:23:12 -0600
  2228. Organization: Bard 'O Matic Software
  2229.  
  2230. Ok this is the deal:
  2231.  
  2232. I have a list in a window that has a bunch of item in it. The user scroll
  2233. through the list, ect and double click on an item. At this point a modal
  2234. dialog pops up and the user can edit 15 or so fields.
  2235.  
  2236. Now, modals are ugly, evil things and I wast to get away fromn them. So,
  2237. what I was thinking was enarging the original window and having the fields
  2238. next to the scrolling list. That way, when the user clicks on an item in
  2239. the list, the fields to the right of the list automaticly fill in and can
  2240. be edited.
  2241.  
  2242. Now, the problem:
  2243.  
  2244. I'm kind of fuzzy on how to do this. I know creating 15 TEHandles can't be
  2245. correct. so that leaves creating one TEHandle and mapping it to 1 of 15
  2246. different places on the screen on the fly depending on where the cursor is
  2247. at the time. Still, this seems kind of ugly, and I'm thinking there has
  2248. got to be a better way. So, is there a better way? :)
  2249.  
  2250. Wayde
  2251.  
  2252. +++++++++++++++++++++++++++
  2253.  
  2254. >From demos@amug.org (Demos)
  2255. Date: Thu, 30 Mar 1995 03:31:05 -0600
  2256. Organization: University of Utah
  2257.  
  2258. In article <wem53067-3003951523120001@antwerp-6.slip.uiuc.edu>,
  2259. wem53067@uxa.cso.uiuc.edu (The Bard) wrote:
  2260. zzy on how to do this. I know creating 15 TEHandles can't be
  2261. > correct. so that leaves creating one TEHandle and mapping it to 1 of 15
  2262. > different places on the screen on the fly depending on where the cursor is
  2263. > at the time. Still, this seems kind of ugly, and I'm thinking there has
  2264. > got to be a better way. So, is there a better way? :)
  2265. > Wayde
  2266.  
  2267. hey buddy,
  2268. why don't you just use C++? Like.. PowerPlant? It would be so *much*
  2269. easier to do!
  2270.  
  2271. _____________________________________________________________________
  2272. Demos <demos@amug.org> | IRC:#macdev | anonymous FTP: 128.110.196.231
  2273.  
  2274. +++++++++++++++++++++++++++
  2275.  
  2276. >From wem53067@uxa.cso.uiuc.edu (The Bard)
  2277. Date: Thu, 30 Mar 1995 17:23:30 -0600
  2278. Organization: Bard 'O Matic Software
  2279.  
  2280. In article <demos-3003950331050001@chem-31.chem.utah.edu>, demos@amug.org
  2281. (Demos) wrote:
  2282.  
  2283. > hey buddy,
  2284. > why don't you just use C++? Like.. PowerPlant? It would be so *much*
  2285. > easier to do!
  2286.  
  2287. Welp, I really prefer C to C++ (yea I know, don't start...) Plus I'm a
  2288. control freak and I wanna know exactly whats going on most of the time...
  2289.  
  2290. Wayde
  2291.  
  2292. +++++++++++++++++++++++++++
  2293.  
  2294. >From ivanski@world.std.com (Ivan M CaveroBelaunde)
  2295. Date: Fri, 31 Mar 1995 01:38:23 GMT
  2296. Organization: The World Public Access UNIX, Brookline, MA
  2297.  
  2298. wem53067@uxa.cso.uiuc.edu (The Bard) writes:
  2299. >I have a list in a window that has a bunch of item in it. The user scroll
  2300. >through the list, ect and double click on an item. At this point a modal
  2301. >dialog pops up and the user can edit 15 or so fields.
  2302.  
  2303. >Now, modals are ugly, evil things and I wast to get away fromn them. So,
  2304. >what I was thinking was enarging the original window and having the fields
  2305. >next to the scrolling list. That way, when the user clicks on an item in
  2306. >the list, the fields to the right of the list automaticly fill in and can
  2307. >be edited.
  2308.  
  2309. >Now, the problem:
  2310.  
  2311. >I'm kind of fuzzy on how to do this. I know creating 15 TEHandles can't be
  2312. >correct. so that leaves creating one TEHandle and mapping it to 1 of 15
  2313. >different places on the screen on the fly depending on where the cursor is
  2314. >at the time. Still, this seems kind of ugly, and I'm thinking there has
  2315. >got to be a better way. So, is there a better way? :)
  2316.  
  2317. I've used that approach before. It's pretty easy and clean if you use
  2318. abstraction properly (note that this is pseudocode):
  2319.  
  2320. //      Begin SharedTEHandle.h
  2321.  
  2322. typedef struct SharedTE SharedTE, **SharedTEHandle;
  2323.  
  2324. typedef (*RelinquishSharedTEProcPtr)(SharedTEHandle teHandle, long ownerRef);
  2325.  
  2326. SharedTEHandle InitSharedTEHandle();
  2327.  
  2328. // Claim and relinquish ownership
  2329.  
  2330. GetSharedTEHandle(SharedTEHandle sharedTE, long ownerRef,
  2331.  StringPtr theText, RelinquishSharedTEProcPtr ownerProc, Rect *teRect);
  2332.  
  2333. RelinquishSharedTEHandle(SharedTEHandle sharedTE, owner wasMe);
  2334.  
  2335. // Get and Set Text Routines
  2336.  
  2337. SetSharedTEHandleText(SharedTEHandle sharedTE, StringPtr theText,
  2338.  long me);
  2339.  
  2340. GetSharedTEHandleText(SharedTEHandle sharedTE, StringPtr theText,
  2341.  long me);
  2342.  
  2343.  
  2344.  
  2345. //      Begin SharedTEHandle.c
  2346.  
  2347. #include "SharedTEHandle.h"
  2348.  
  2349. struct SharedTE {
  2350.  TEHandle *theHandle;
  2351.  long      ownerRef;
  2352.  RelinquishSharedTEProcPtr ownerProc;
  2353. };
  2354.  
  2355. SharedTEHandle InitSharedTEHandle()
  2356. {
  2357.         //      allocte the TEHandle and te SharedTEHandle struct.
  2358.         //      Set the owner to zero, the text inside the teHandle
  2359.         //      to empty
  2360. }
  2361.  
  2362. GetSharedTEHandle(SharedTEHandle sharedTE, long ownerRef,
  2363.  StringPtr theText, RelinquishSharedTEProcPtr ownerProc, Rect *teRect)
  2364. {
  2365.         //      Call RelinquishSharedTEHandle with the owner parameter
  2366.         //      set properly (owner field). Zero out owner and ownerProc,
  2367.         //      stick theText into the TEHandle, set the
  2368.         //      teRect appropriately, and stuff ownerRef and ownerProc
  2369.         //      into the struct
  2370. }
  2371.  
  2372. RelinquishSharedTEHandle(SharedTEHandle sharedTE, owner wasMe)
  2373. {
  2374.         //      If wasMe is not the owner, bail; otherwise,
  2375.         //      if owner and ownerProc are nonzero call the ownerProc,
  2376.         //      zero out owner and ownerProc and return
  2377. }
  2378.  
  2379. SetSharedTEHandleText(SharedTEHandle sharedTE, StringPtr theText,
  2380.  long me)
  2381. {
  2382.         //      If me is the owner, stick theText into the TEHandle
  2383. }
  2384.  
  2385. GetSharedTEHandleText(SharedTEHandle sharedTE, StringPtr theText,
  2386.  long me)
  2387. {
  2388.         //      If me is the owner, get the text from the TEHandle
  2389.         //      and return it in theText
  2390. }
  2391.  
  2392. //      End of pseudocode
  2393.  
  2394. Use of the library is left as an exercise for the reader. It'd also
  2395. be much nicer in C++, but it does the job as is.
  2396.  
  2397. -Ivan
  2398. - --
  2399. Ivan Cavero Belaunde (ivanski@world.std.com, ivanski@avid.com)
  2400. Avid VideoShop Lead
  2401. Avid Technology, Inc.
  2402.  
  2403. ---------------------------
  2404.  
  2405. End of C.S.M.P. Digest
  2406. **********************
  2407.